Коллекция движений объекта хранится в реквизите объекта

  Маркет42 - Место для твоих разработок  

Зачем форме коллекция движений

Я
   Natasha1c

01.08.08 — 15:36

В документе передаеться в качестве параметра значение «этаформа» , обратила внимание что у него есть реквизит движения и там коллекция движений. Может я чего не понимаю, но реквизит движения должны принадлежать только объекту, то есть «этотобъект», а зачем движения для формы ?

  

Партнерская программа EFSOL Oblako

   Natasha1c

1 — 01.08.08 — 15:46

ап

   Mitriy

2 — 01.08.08 — 15:48

просто у нее основными данными является объект, который ее расширяет собою, и вааще-то это очень даже удобно :)

  

megalodon

3 — 01.08.08 — 15:51

Коллекция движений и относится к объекту. Есть такое понятие как основной реквизит формы, для формы документа это обычно ДокументОбъект. Так вот получить доступ к свойствам основного реквизита формы можно, явно не указывая сам основной реквизит.

то есть полкчается в нашем случае не ЭтаФорма.ДокументОбъект.Движения

а

ЭтаФорма.Движения

Движения документа

Движения
документа —

это записи в регистрах, которые создаются
в процессе проведения документа и
отражают изменения, производимые
документом.

Откроем
окно редактирования объекта конфигурации
Документ ПриходнаяНакладная.
Перейдем на закладку
Движения,

раскроем список
Регистры накопления

и отметим регистр накопления
ОстаткиМатериалов
(рис. 6.7).

Рис.6.7. Создание
движений документа «Приходная накладная»
в регистре «Остатки материалов»

Обратите
внимание, что сразу после отметки
выбранного регистра становится доступной
кнопка
Конструктор движений.

Нажмем ее и воспользуемся этим
конструктором.

Рис.6.8. Конструктор
движений

Конструктор
устроен просто. В списке
Регистры

перечислены регистры, в которых документ
может создавать движения. В нашем случае
там пока один регистр
ОстаткиМатериалов

В
списке
Реквизиты документа

должны находиться исходные данные для
создания движений — реквизиты документа
ПриходнаяНакладная.

А
в таблице
Поле — Выражение

должны быть заданы формулы, по которым
будут вычисляться значения измерений
и ресурсов регистра при записи движений
(рис. 6.8).

Обратите
внимание, что по умолчанию конструктор
предлагает нам создавать движения
прихода
(Тип движения регистра — Приход,
символ
+ рядом с названием регистра) по регистру
ОстаткиМатериалов.

Это нас вполне устраивает, ведь документ
ПриходнаяНакладная

и должен приходовать материалы.

В
поле выбора
Табличная часть

выберем табличную часть нашего документа

Материалы.

Список реквизитов
документа, который уже заполнен
реквизитами шапки документа, автоматически
дополнится реквизитами нашей табличной
части.

Теперь
нажмем кнопку
Заполнить выражения.

В
нижнем окне сформируется соответствие
полей (измерений и ресурсов) регистра
и выражений для их расчета (рис. 6.9).

Рис. 6.9. Выбор
табличной части документа и заполнение
выражений для расчета движений регистра

Как
видите, конструктор движений установил
соответствия подходящим образом: в
качестве материала в регистр будет
записан материал из табличной части
документа, в качестве склада — склад,
указанный в шапке документа, а в качестве
количества — количество из табличной
части документа.

Нажмем
кнопку ОК и посмотрим, какой текст
сформировал конс­труктор в модуле
документа
ПриходнаяНакладная

(листинг
6.1).

Конструктор
создал обработчик события
ОбработкаПроведения
объекта
конфигурации Документ
ПриходнаяНакладная,

поместил его в модуль объекта и открыл
текст модуля.

Событие
ОбработкаПроведения

является одним из важнейших событий,
связанных с документом. Это событие
возникает при про­ведении документа.
Основное назначение обработчика данного
события — генерация движений по документу.
Выполнение различных операций с данными
в процедуре обработчика влияет на
состояние учета. Таким образом, именно
в эту процедуру разработчик должен
поместить собственные алгоритмы
преобразования данных, выполняемые в
момент проведения документа.

Поясним текст
процедуры обработчика.

Объект
встроенного языка
ДокументОбъект

имеет свойство
Движения.
Оно
возвращает объект
КоллекцияДвижений,

содержащий коллекцию наборов записей
регистров, по которым этот документ
может формировать движения.

К
конкретному набору записей этой коллекции
можно обратиться, указав через точку
имя регистра, которому принадлежит этот
набор записей. Например,
Движения.ОстаткиМатериалов.

Затем
через точку можно использовать различные
методы набора записей регистра, например,
Движения.ОстаткиМатериалов.Добавить().

Метод
Добавить()

добавляет новую запись
в
набор записей.

В
первой строке процедуры мы устанавливаем
свойство
Записывать
набора
записей регистра в значение
Истина.

То есть в явном виде указываем, что после
завершения обработки проведения
платформа должна будет записать этот
набор записей в базу данных.

Внутри
обработчика расположен цикл
Для Каждого … Из … Цикл.
Он
предназначен для перебора строк табличной
части нашего документа.

В
цикле обращение к табличной части
документа происходит по имени
(Материалы).

Переменная
ТекСтрокаМатериалы

содержит объект с данными текущей строки
табличной части документа. Эта переменная
создается в начале цикла и меняется по
мере его прохождения.

В
первой строке тела цикла, используя
метод
Добавить(),

мы добавляем к набору записей, который
создает наш документ в регистре, новую
запись. Тем самым мы создаем объект
РегистрНакопленияЗапись

и сохраняем его в переменной
Движение.

Используя
этот объект, мы можем обратиться к полям
этой записи, указав имя поля через точку
от этой переменной (например,
Движение.Количество).

Причем
Движение.Материал, Движение.Склад

— это измерения регистра,
Движение.Количество

— это ресурс регистра, а
Движение.ВидДвижения

и
Движение.Период

— стандартные реквизиты регистра, которые
создаются автоматически.

Чтобы
присвоить полям новой записи регистра
соответствующие значения полей документа,
мы обращаемся к полям табличной части,
указав имя поля через точку от переменной
ТекСтрокаМатериалы
(например,
ТекСтрокаМатериалы.Материал).

Заметим,
что
Склад

— это реквизит шапки документа, а
Дата

— стандартный реквизит документа, который
создается автоматически. Причем в цикле
меняются только значения полей табличной
части документа —
ТекСтрокаМатериалы.Материал

и
ТекСтрокаМатериалы.Количество.

Остальные поля не меняются, так как
относятся к документу в целом и не
зависят от текущей строки табличной
части документа.

ВидДвиженияНакопления.Приход
— это значение системного перечис­ления,
которое определяет вид движения регистра
накопления
как Приход.

Таким
образом, мы присваиваем нужные значения
всем полям новой записи. После перебора
всех строк документа (после завершения
цикла) в этом наборе записей
(Движения.ОстаткиМатериалов)

будет содержаться столько записей,
сколько строк в табличной части
проводимого документа.

Если
мы теперь откроем окно редактирования
объекта конфигурации Регистр накопления
ОстаткиМатериалов

и перейдем на закладку Регистраторы,
то в списке документов, созданных в
конфигурации, мы увидим отмеченный
документ
ПриходнаяНакладная,

так как мы задали в модуле этого документа
формирование движений в регистре
ОстаткиМатериалов
(рис. 6.10).

Рис.6.10. Регистраторы
регистра «ОстаткиМатериалов»

В
заключение отредактируем командный
интерфейс, чтобы в подсистемах
Бухгалтерия, Оказание услуг

и
Учет материалов

была доступна ссылка для просмотра
записей нашего регистра накопления.

Дело в том, что
команды открытия регистров также
добавляются в панель навигации подсистем,
но по умолчанию они невидимы, в отличие
от команд открытия справочников и
документов.

В
дереве объектов конфигурации выделим
ветвь
Подсистемы,
вызовем
ее контекстное меню и выберем пункт
Все подсистемы.

В
открывшемся окне слева в списке
Подсистемы

выделим подсистему УчетМатериалов.

Справа
в списке
Командный интерфейс

отразятся все команды выбранной
подсистемы.

В
группе
Панель навигации. Обычное
включим видимость у команды Остатки
материалов
и мышью перетащим ее в группу
Панель навигации. См.также
(рис.
6.11).

Рис.6.11. Настройка
командного интерфейса подсистем

Действительно,
команды открытия регистров накопления
не так часто используются, и поэтому
лучше их перенести в группу См.также
панели навигации разделов интерфейса.

Аналогично,
выделив подсистемы
ОказаниеУслуг

и
Бухгалтерия,

в панели навигации в группе
Обычное

включим видимость у команды Остатки
материалов

и перенесем ее в группу
См.также.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #

    01.06.201523.04 Mб8Занятие_4.doc

  • #
  • #
  • #
  • #
  • #
  • #

 +1 

   

Распечатать

1С 8.x : Как Получить, Прочитать, Изменить Движения документа по регистру?

Если необходимо просто прочитать движения, без последующей модификации, можно воспользоваться запросом к нужному регистру:

Код 1C v 8.х

 // Чтение движений документа с помощью запроса
Запрос = Новый Запрос;

Запрос.Текст =
"ВЫБРАТЬ
| *
|ИЗ
| РегистрНакопления.ОстаткиНоменклатуры КАК ОстаткиНоменклатуры
|ГДЕ
| ОстаткиНоменклатуры.Регистратор = &Регистратор";

Запрос.УстановитьПараметр("Регистратор", ПолеВводаРегистратор);

В запросе выбираем все поля (кроме виртуальных) из таблицы регистра РегистрНакопления.ОстаткиНоменклатуры с отбором по регистратору. Значением параметра Регистратор нужно будет установить ссылку на документ.

Если же нужно чтение с последующей модификацией движений, следует воспользоваться объектной моделью представления информации: в свойстве Движения объекта документа обратиться к нужному регистру (в нашем случае это регистр ОстаткиНоменклатуры) и прочитать набор записей регистра.

Код 1C v 8.х

 // Чтение движений документа
НаборЗаписейРегистра = Движения.ОстаткиНоменклатуры;

НаборЗаписейРегистра.Прочитать();

Для Каждого Запись из НаборЗаписейРегистра Цикл

// Чтение и модификация очередного движения.

КонецЦикла;

Если требуется изменить движения документа по всем регистрам, нужно обойти фиксированную коллекцию, содержащуюся в свойстве Движения:

Код 1C v 8.х

 // Изменение движений документа
Для Каждого НаборЗаписейРегистра из Движения Цикл
НаборЗаписейРегистра.Прочитать();

Для Каждого Запись из НаборЗаписейРегистра Цикл

// Чтение и модификация очередного движения.

КонецЦикла;

КонецЦикла;

Сначала открываем цикл перебора свойств свойства Движения – коллекций наборов записей регистров, для которых наш документ является регистратором.
Далее читаем наборы записей каждой коллекции и открываем цикл перебора записей данного набора записей.

На чтение 4 мин. Просмотров 162 Опубликовано 15.12.2019

Документы в 1С 8.2 и 8.3 — объект метаданных, с помощью которого в 1С фиксируются хозяйственные операции предприятия.

Каждый созданный документ в конфигурации создать для отражения своего типа операции, например: поступление товаров, списание товаров и т.д.

Документы могут проводиться, а могут просто записываться. Документ, у которого разрешено проведение, как правило, при проведении создает записи в регистрах сведений, регистрах накопления, регистрах бухгалтерии, регистрах расчета, тем самым внося изменения в учет организации. Документы, у которых запрещено проведение, обычно используются как печатные формы, например: счет, доверенность и т.д.

Рассмотрим основные настройки и свойства документов.

Настройка и свойства документов в 1C 8.3 и 8.2

Рассмотрим самые интересные вкладки с точки зрения разработчика.

Данные

Одна из основные вкладок документа:

Здесь описывается структура хранения информации будущего документа, реквизиты аналогичны справочнику. Сильно отличаются стандартные реквизиты:

Получите 267 видеоуроков по 1С бесплатно:

Движения документа

Самая важная вкладка, на которой определяется состав регистров, по которым будет делать движения документ:

Рассмотрим подробно свойства документа на этой странице:

Проведение — разрешить или запретить. Определяет, будут ли движения по данному документу.

Оперативное проведение — разрешить или запретить. Если установлено разрешить, то проведение документа будущей датой невозможно.

Удаление движений — определяет режим очистки движения документа: Удалять автоматически при отмене проведения — движения будут очищены только при нажатии кнопки «Отмена проведения», но не удаляет при перепроведении. Удалять автоматически — значит, что движения будут удаляться в любом случае, даже если документ 1С перепроводится. Не удалять автоматически — значит, что удаление движений берет на себя разработчик системы.

Также для построения простых движений документа существует специальный конструктор движений, позволяющий упростить разработку:

Ввод на основании

Документ может быть введен на основании плана обмена, справочника, бизнес-процесса, задачи или другого документа. Для удобства можно воспользоваться специальным конструктором ввода на основании, который автоматически сгенерирует модуль обработчика заполнения:

Прочее

На вкладке Прочее можно найти очень важное свойство документа 1С (Режим блокировки):

Режим блокировок, может быть два значения — автоматический и управляемый, подробнее о блокировках.

Также со вкладки Прочее можно перейти в модуль менеджера и модуль объекта.

Небольшое обзорное видео про документы в 1С для программистов:

Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):

К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.

Если необходимо просто прочитать движения, без последующей модификации, можно воспользоваться запросом к нужному регистру:
Код 1C v 8.х
В запросе выбираем все поля (кроме виртуальных) из таблицы регистра РегистрНакопления.ОстаткиНоменклатуры с отбором по регистратору. Значением параметра Регистратор нужно будет установить ссылку на документ.

Если же нужно чтение с последующей модификацией движений, следует воспользоваться объектной моделью представления информации: в свойстве Движения объекта документа обратиться к нужному регистру (в нашем случае это регистр ОстаткиНоменклатуры) и прочитать набор записей регистра.
Код 1C v 8.х

Если требуется изменить движения документа по всем регистрам, нужно обойти фиксированную коллекцию, содержащуюся в свойстве Движения:
Код 1C v 8.х
Сначала открываем цикл перебора свойств свойства Движения – коллекций наборов записей регистров, для которых наш документ является регистратором.
Далее читаем наборы записей каждой коллекции и открываем цикл перебора записей данного набора записей.

Если необходимо просто прочитать движения, без последующей модификации, можно воспользоваться запросом к нужному регистру:
Код 1C v 8.х
В запросе выбираем все поля (кроме виртуальных) из таблицы регистра РегистрНакопления.ОстаткиНоменклатуры с отбором по регистратору. Значением параметра Регистратор нужно будет установить ссылку на документ.

Если же нужно чтение с последующей модификацией движений, следует воспользоваться объектной моделью представления информации: в свойстве Движения объекта документа обратиться к нужному регистру (в нашем случае это регистр ОстаткиНоменклатуры) и прочитать набор записей регистра.
Код 1C v 8.х

Если требуется изменить движения документа по всем регистрам, нужно обойти фиксированную коллекцию, содержащуюся в свойстве Движения:
Код 1C v 8.х
Сначала открываем цикл перебора свойств свойства Движения – коллекций наборов записей регистров, для которых наш документ является регистратором.
Далее читаем наборы записей каждой коллекции и открываем цикл перебора записей данного набора записей.

Содержание

  • 1 Реквизиты формы
    • 1.1 Типы данных, доступные в управляемой форме
    • 1.2 Преобразование прикладных объектов в данные формы
    • 1.3 Передача данных между клиентской и серверной частями управляемой формы
    • 1.4 Методы для преобразования данных прикладных объектов в данные формы
  • 2 Программный интерфейс
    • 2.1 ДанныеФормыДерево (FormDataTree)
      • 2.1.1 ПолучитьЭлементы (GetItems)
      • 2.1.2 НайтиПоИдентификатору (FindById)
    • 2.2 ДанныеФормыЭлементДерева (FormDataTreeItem)
    • 2.3 ДанныеФормыКоллекцияЭлементовДерева (FormDataTreeItemCollection)
  • 3 Особенности работы с деревом значений
    • 3.1 Обновление дерева

Реквизиты формы

Набор реквизитов формы описывает состав данных, которые отображаются, редактируются или хранятся в форме. При этом реквизиты формы сами по себе не обеспечивают возможности отображения и редактирования данных. Для отображения и редактирования служат элементы формы (смотрите раздел «Элементы формы» данной главы), связанные с реквизитами формы. Совокупность всех реквизитов формы будем называть данными формы.

Важно! Необходимо помнить, что, в отличие от обычных форм, все данные управляемой формы должны быть описаны в виде реквизитов. Не допускается использование переменных модуля формы в качестве источников данных для элементов формы.

Имеется возможность назначить Основной реквизит формы, т. е. реквизит, который будет определять стандартную функциональность формы (расширение формы). Следует помнить, что основной реквизит у формы может быть только один.

Расширение формы – это дополнительные свойства, методы и параметры формы объекта УправляемаяФорма, характерные для объекта, являющегося основным элементом формы.

В процессе разработки формы можно явно задать возможность просмотра и редактирования конкретных реквизитов формы, в разрезе ролей, с помощью свойств Просмотр и Редактирование (подробнее смотрите раздел «Ролевая настройка формы» главы «Редакторы»). Кроме того, доступность того или иного реквизита в самой форме можно настраивать с помощью функциональных опций (подробнее о функциональных опциях можно посмотреть в главе «Управление интерфейсом конфигурации»).

Свойство реквизита формы Сохраняемые данные является признаком того, что интерактивное изменение реквизита будет приводить к попытке блокировки данных формы для редактирования, а также к автоматической установке признака модифицированности формы.

Типы данных, доступные в управляемой форме

Управляемая форма отличается от обычной формы также и типами данных, с которыми она работает. Если обычная форма работает с большинством типов, которые предоставляет 1С:Предприятие (в том числе и вида СправочникОбъект, ДокументОбъект и т. д.), то в управляемой форме можно выделить следующие категории типов:

  • типы, которые непосредственно используются в форме – это те типы, которые существуют на стороне тонкого и Веб-клиента (например, Число, СправочникСсылка.Товары, ГрафическаяСхема, ТабличныйДокумент);
  • типы, которые будут преобразованы в специальные типы данных – типы данных управляемой формы. Такие типы отображаются в списке реквизитов формы в круглых скобках, например (СправочникОбъект.Товары);
  • динамический список (подробнее см. раздел «Динамический список» данной главы).

Преобразование прикладных объектов в данные формы

Некоторые прикладные типы (такие как СправочникОбъект и т. д.) не существуют на стороне тонкого и Веб-клиентов (подробнее см. главу «Концепция управляемого приложения»). Поэтому для представления в форме таких прикладных типов в платформе введены специальные типы данных, предназначенные для работы в управляемых формах. Эта особенность управляемого приложения обуславливает необходимость выполнять преобразование прикладных объектов в данные формы (и обратно).

Используются следующие типы данных:

  • ДанныеФормыСтруктура – содержит набор свойств произвольного типа. Свойствами могут быть другие структуры, коллекции или структуры с коллекциями. Таким типом представляется, например, в форме СправочникОбъект.
  • ДанныеФормыКоллекция – это список типизированных значений, похожий на массив. Доступ к элементу коллекции осуществляется по индексу или по идентификатору. Доступ по идентификатору может отсутствовать в некоторых случаях. Это обусловлено типом прикладного объекта, который представлен этой коллекцией. Идентификатором может быть любое целое число. Таким типом представляется, например, в форме табличная часть.
  • ДанныеФормыСтруктураСКоллекцией – это объект, который представлен в виде структуры и коллекции одновременно. С ним можно обращаться как с любой из этих сущностей. Таким типом представляется, например, в форме набор записей.
  • ДанныеФормыДерево – объект предназначен для хранения иерархических данных.

Прикладной объект представлен либо одним, либо несколькими элементами данных формы. В общем виде иерархия и состав данных формы зависят от сложности и взаимосвязи прикладных объектов управляемой формы.

Например, документ, содержащий табличную часть, будет представлен объектом типа ДанныеФормыСтруктура (собственно документ), которому подчинен объект типа ДанныеФормыКоллекция (табличная часть документа).

Важно! Во время разработки конфигурации важно помнить, что прикладные объекты доступны только на сервере, в то время как объектами данных форм можно пользоваться и на сервере, и на клиенте.

Передача данных между клиентской и серверной частями управляемой формы

Фактически можно сказать, что данные формы – это унифицированное представление данных различных прикладных объектов, с которыми форма работает единообразно и которые присутствуют и на сервере, и на клиенте. То есть форма содержит некоторую «проекцию» данных прикладных объектов в виде своих собственных типов данных и выполняет преобразование между ними при необходимости. Однако в случае если разработчик конфигурации реализует свой алгоритм обработки данных, то преобразование данных (из специализированных типов в прикладные и обратно) он должен выполнять самостоятельно.

При редактировании реквизитов формы в специализированном редакторе (подробнее см. раздел «Реквизиты формы» главы «Редакторы») имеется возможность влиять на передачу данных между клиентом и сервером во время работы формы. Для этого служит колонка редактора реквизитов Использовать всегда. Действие этого свойства различается для трех типов реквизитов:

  • Для реквизита, подчиненного динамическому списку (колонке динамического списка):
    • свойство включено – реквизит всегда считывается из базы данных и включается в данные формы;
    • свойство выключено – реквизит считывается из базы данных и включается в данные формы только тогда, когда есть видимый в данный момент элемент формы, связанный с реквизитом или его подчиненным реквизитом.
  • Для реквизита, подчиненного коллекции движений:
    • свойство включено – движения документа считываются из базы данных и будут присутствовать в данных формы;
    • свойство выключено – движения документа не будут считываться из базы данных и не попадут в данные формы (если нет элемента формы, ссылающегося на движения документа).
  • Остальные реквизиты формы:
    • свойство включено – реквизит будет присутствовать в данных формы вне зависимости от того, есть или нет хоть один элемент формы, который связан с реквизитом или его подчиненным реквизитом;
    • свойство выключено – реквизит будет присутствовать в данных формы только в том случае, если есть элемент формы, связанный с реквизитом или его подчиненным реквизитом. В отличие от реквизитов динамического списка, здесь не играет роли видимость элемента, связанного с реквизитом.

Примечание. Следует помнить, что свойство, установленное у родительского реквизита, действует на все подчиненные реквизиты. Например, если свойство Использовать всегда снято у табличной части документа, то система считает, что это свойство снято и у всех подчиненных реквизитов (несмотря на фактическое состояние свойства).

Методы для преобразования данных прикладных объектов в данные формы

Для конвертирования прикладных объектов в данные формы и обратно существует набор глобальных методов:

  • ЗначениеВДанныеФормы(),
  • ДанныеФормыВЗначение(),
  • КопироватьДанныеФормы().

Важно! Методы, работающие с прикладными объектами, доступны только в серверных процедурах. Метод для копирования значений между данными формы доступен на сервере и на клиенте, так как не требует прикладных объектов в качестве параметров.

Во время конвертирования данных формы в прикладной объект нужно учитывать их совместимость.

  • ЗначениеВДанныеФормы() – преобразует объект прикладного типа в данные формы;
  • ДанныеФормыВЗначение() – преобразует данные формы в объект прикладного типа;
  • КопироватьДанныеФормы() – производит копирование данных формы, обладающих совместимой структурой. Возвращает значение Истина, если копирование произведено, или Ложь, если структура объектов несовместима.

Примечание. При выполнении стандартных действий (открытие формы, выполнение стандартной команды Записать и т. д.) формы с основным реквизитом, преобразование выполняется автоматически.

Приведем пример, как использовать преобразование данных в собственных алгоритмах.

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
  ОбъектТовар = Справочники.Товары.НайтиПоНаименованию(«Кофейник»).ПолучитьОбъект();
  ЗначениеВДанныеФормы(ОбъектТовар, Объект);
КонецПроцедуры
 
&НаКлиенте
Процедура Записать()
  ЗаписатьНаСервере();
КонецПроцедуры
 
&НаСервере
Процедура ЗаписатьНаСервере()
  ОбъектТовар = ДанныеФормыВЗначение(Объект, Тип(«СправочникОбъект.Товары»));
  ОбъектТовар.Записать();
КонецПроцедуры

Также у объекта УправляемаяФорма существуют методы, доступные на сервере:

  • ЗначениеВРеквизитФормы() – выполняет преобразование объекта прикладного типа в заданный реквизит формы.
  • РеквизитФормыВЗначение() – преобразует реквизит данных формы в объект прикладного типа.

Использование данных методов обычно удобнее, так как они, имеют, например, информацию о типе реквизита формы. Кроме того, метод РеквизитФормыВЗначение() выполняет установку соответствия данных формы и объекта, которая используется при формировании сообщений. Подробнее об этом можно прочитать в главе «Сервисные возможности навигации».

Приведем пример использования этих методов.

&НаСервере
Процедура ПересчитатьНаСервере()
 
  // Преобразует реквизит Объект в прикладной объект.
  Документ = РеквизитФормыВЗначение(«Объект»);
 
  // Выполняет пересчет методом, определенным в модуле документа.
  Документ.Пересчитать();
 
  // Преобразует прикладной объект обратно в реквизит.
  ЗначениеВРеквизитФормы(Документ, «Объект»);
КонецПроцедуры

Программный интерфейс

ДанныеФормыДерево (FormDataTree)

Методы:

  • НайтиПоИдентификатору (FindById)
  • ПолучитьЭлементы (GetItems)

Описание:

Предназначен для моделирования дерева в данных управляемой формы.

Доступность: клиент, сервер, тонкий клиент, веб-клиент. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту определяется в пространстве имен . Имя типа XDTO:

ПолучитьЭлементы (GetItems)

Синтаксис:

ПолучитьЭлементы()

Возвращаемое значение:

Тип: ДанныеФормыКоллекцияЭлементовДерева.

Описание:

Получает коллекцию элементов дерева верхнего уровня.

Доступность: клиент, сервер, тонкий клиент, веб-клиент.

НайтиПоИдентификатору (FindById)

Синтаксис:

НайтиПоИдентификатору(<Идентификатор>)

Параметры:

<Идентификатор> (обязательный)

Тип: Число. Идентификатор элемента дерева.

Возвращаемое значение:

Тип: ДанныеФормыЭлементДерева.

Описание:

Получает элемент коллекции по идентификатору.

Доступность: клиент, сервер, тонкий клиент, веб-клиент.

ДанныеФормыЭлементДерева (FormDataTreeItem)

Свойства:

<Имя свойства> (<Имя свойства>)

Методы:

  • ПолучитьИдентификатор (GetId)
  • ПолучитьРодителя (GetParent)
  • ПолучитьЭлементы (GetItems)
  • Свойство (Property)

Описание:

Элемент дерева данных формы.

Доступность: клиент, сервер, тонкий клиент, веб-клиент. Данный объект может быть сериализован в/из XDTO. Тип XDTO, соответствующий данному объекту определяется в пространстве имен . Имя типа XDTO:

ДанныеФормыКоллекцияЭлементовДерева (FormDataTreeItemCollection)

Элементы коллекции:
ДанныеФормыЭлементДерева

Для объекта доступен обход коллекции посредством оператора Для каждого … Из … Цикл. При обходе выбираются элементы коллекции.
Возможно обращение к элементу коллекции посредством оператора […]. В качестве аргумента передается индекс элемента.

Методы:

  • Вставить (Insert)
  • Добавить (Add)
  • Индекс (IndexOf)
  • Количество (Count)
  • Очистить (Clear)
  • Получить (Get)
  • Сдвинуть (Move)
  • Удалить (Delete)

Описание:

Коллекция элементов дерева.

Доступность: клиент, сервер, тонкий клиент, веб-клиент.

См. также:

  • ДанныеФормыЭлементДерева, метод ПолучитьЭлементы
  • ДанныеФормыДерево, метод ПолучитьЭлементы

Особенности работы с деревом значений

Обновление дерева

Существует проблема падения платформы при обновлении дерева.

Если в дереве был развернут какой-либо узел и выбран подчиненный узел, то при обновлении дерева функцией ЗначениеВДанныеФормы
происходит падение платформы.

Решение: перед обновлением нужно очищать дерево.

Например:

&НаСервере
Процедура ОчиститьДерево(элементы)
	Для каждого элемент из элементы Цикл
		ОчиститьДерево(элемент.ПолучитьЭлементы());
	КонецЦикла;
	элементы.Очистить();
КонецПроцедуры

&НаСервере
Процедура ЗаполнитьДеревоПонятий()
	дзПонятия = срСвойства.ПостроитьДеревоПонятий(НаДату, Мета.ТекущаяИБ());
	ОчиститьДерево(ДеревоПонятий.ПолучитьЭлементы());
	ЗначениеВДанныеФормы(дзПонятия, ДеревоПонятий);
КонецПроцедуры

&НаКлиенте
Процедура НаДатуПриИзменении(Элемент)
	ЗаполнитьДеревоПонятий();
КонецПроцедуры

В этой статье мы разберем схему проведения документа по регистрам в типовых конфигурациях УТ 11, КА 2 и ERP 2.

Для чего это нужно?

  • Доработка проведения документов по существующим и новым регистрам встречается на любом серьезном проекте.
  • Другой тип задач – разобраться, почему документ формирует те или иные движения.

    Нередко в документации написано одно, а по факту всё работает иначе. И приходится уходить в отладку, разбираться с общими модулями и стеком из десятка вложенных вызовов.

Что конкретно будем рассматривать

Мы разберем алгоритмы типовых конфигураций – и научимся быстро отлаживать и дорабатывать универсальные механизмы проведения документов тиражных решений фирмы 1С.

В результате Вы будете знать ответы на вопросы:

  • Где находятся алгоритмы формирования движений?
  • Как изменить типовое проведение документа?
  • Как адаптировать документ для движений по собственному регистру?

Для ответа на поставленные вопросы, без «длительного копания в тоннах типового кода» и быстрого получения результата, необходимо знать схему проведения документа.

А что самое приятное – почти все типовые документы проводятся по одинаковой схеме, неважно, реализация это, приходный кассовый ордер или план закупок.
Поэтому, изучив общую схему, Вы сможете доработать любой документ. :)

Схема проведения документа

Укрупненно проведение документа происходит в два этапа, первый этап – подготовка и запись данных, второй этап – контроль отрицательных остатков.

Можно сделать вывод, что в схеме проведения документа используется новая методика контроля остатков, когда сначала формируются движения, а затем проверяется допустимость сформированных движений.

Дополнительно о методиках контроля остатков можно прочитать в другой нашей статье: https://курсы-по-1с.рф/articles/2017-02-12-two-methods-for-inventory-check/

Театр начинается с вешалки, а проведение документа – с процедуры ОбработкаПроведения() модуля объекта. Порядок действий в обработке проведения документа можно представить в виде следующей схемы:

Рисунок 1. Схема действий обработки проведения документа

Рассмотрим детально каждую точку алгоритма проведения на примере документа «Реализация товаров и услуг».

1. Инициализация дополнительных свойств для проведения

ПроведениеСервер.ИнициализироватьДополнительныеСвойстваДляПроведения(Ссылка, ДополнительныеСвойства, РежимПроведения);

Вызывается процедура ИнициализироватьДополнительныеСвойстваДляПроведения() общего модуля ПроведениеСервер, в процедуру кроме ссылки и режима проведения передаются ДополнительныеСвойства.

ДополнительныеСвойства – свойство объекта документ, структура, которая может хранить некоторые значения, связанные с объектом, без изменения объекта.

Свойство доступно для изменения не только в обработке проведения, но и прочих обработчиках модуля объекта, и это свойство доступно, пока существует объект. Например, можно в обработчике перед записью поместить в это свойство некоторые данные и затем воспользоваться ими в обработке проведения.

В вызываемой процедуре инициализируются общие для всех документов структуры (ДляПроведения и ТаблицыДляДвижений), используемые при проведении документов.

Рисунок 2. Дополнительные свойства после инициализации

Один из ключей ТаблицыДляДвижений – структура, которая будет содержать таблицы значений с данными для выполнения движений, или, проще говоря, готовые наборы движений документа.

2. Заполнение дополнительных свойств для проведения

Заполнение дополнительных свойств, сформированных на предыдущем шаге, – ключевая точка схемы проведения документа, именно на этом этапе формируются будущие наборы записей регистров и помещаются в ключ структуры ТаблицыДляДвижений.

Вызывается процедура ИнициализироватьДанныеДокумента() модуля менеджера объекта, в процедуру передается ссылка на объект и ДополнительныеСвойства.

Документы.РеализацияТоваровУслуг.ИнициализироватьДанныеДокумента(Ссылка, ДополнительныеСвойства);

После завершения работы процедуры каждый ключ структуры ТаблицыДляДвижений содержит таблицу значений с будущими движениями регистра.

Рисунок 3. Таблицы движений регистров в структуре дополнительных свойств

Обратите внимание, что ключи структуры названы по шаблону Таблица[Вт][ИмяРегистраДляДвижения], где Вт – признак временной таблицы, а ИмяРегистраДляДвижения – наименование регистра, куда будут записаны движения из таблицы значений.

Процедура инициализации – это несколько шагов, каждый из которых требует рассмотрения.

 ////////////////////////////////////////////////////////////////////////////
 // Создадим запрос инициализации движений
	
 Запрос = Новый Запрос;
 ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка);
	
 ////////////////////////////////////////////////////////////////////////////
 // Сформируем текст запроса
	
 ТекстыЗапроса = Новый СписокЗначений;
 ТекстЗапросаТаблицаЗаказыКлиентов(Запрос, ТекстыЗапроса, Регистры);
 ТекстЗапросаТаблицаСвободныеОстатки(Запрос, ТекстыЗапроса, Регистры);
 ТекстЗапросаТаблицаОбеспечениеЗаказов(Запрос, ТекстыЗапроса, Регистры);
 ТекстЗапросаТаблицаТоварыКОтгрузке(Запрос, ТекстыЗапроса, Регистры);
 ...
	
 ////////////////////////////////////////////////////////////////////////////
 // Скомпонуем текст запроса и выполним его
	
 ПроведениеСервер.ИнициализироватьТаблицыДляДвижений(Запрос, ТекстыЗапроса, 
			ДополнительныеСвойства.ТаблицыДляДвижений, Истина);

Рассмотрим детально, что происходит в модуле менеджера объекта при вызове процедуры инициализации.

2.1. Заполнение параметров запроса
Запрос = Новый Запрос;
ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка);

Создается объект запрос и формируются параметры будущего запроса по полученной ссылке на документ. Все параметры запроса, которые пригодятся для исполнения текста запроса, устанавливаются методом УстановитьПараметр().

2.2. Формирование текстов запросов
ТекстыЗапроса = Новый СписокЗначений;
ТекстЗапросаТаблицаЗаказыКлиентов(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаСвободныеОстатки(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаОбеспечениеЗаказов(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаТоварыКОтгрузке(Запрос, ТекстыЗапроса, Регистры);

Создается список значений ТекстыЗапроса, который будет содержать тексты запроса. Для каждого регистра, по которому требуется сформировать движения, вызывается процедура ТекстЗапросаТаблица[ИмяРегистраДляДвижения], где ИмяРегистраДляДвижения – наименование регистра, для которого формируется таблица движений. Текст запроса добавляется в список значений ТекстыЗапроса.

Вот и ответ на вопрос: «Где находятся алгоритмы формирования движений?».

Именно в процедуре ТекстЗапросаТаблица[ИмяРегистраДляДвижения] содержится текст запроса, на основании которого будут сформированы движения документа в конкретный регистр учетной системы.

2.3. Получение результата запроса
ПроведениеСервер.ИнициализироватьТаблицыДляДвижений(Запрос, ТекстыЗапроса, ДополнительныеСвойства.ТаблицыДляДвижений, Истина);

Список значений ТекстыЗапроса передается в процедуру ИнициализироватьТаблицыДляДвижений() общего модуля ПроведениеСервер, в процедуре производится компоновка общего текста пакетного запроса по данным списка значений и его выполнение. Затем процедура выгружает результаты запроса в таблицы значений, в свойство ТаблицыДляДвижений, рассмотренное на первом шаге.

3. Подготовка наборов записей документа к записи движений

ПроведениеСервер.ПодготовитьНаборыЗаписейКРегистрацииДвижений(ЭтотОбъект);

Будущие движения сформированы и уже хранятся в структуре ДополнительныеСвойства, теперь требуется подготовить регистры к записи. Процедура взводит флаг записи у наборов записей, по которым документ имеет движения, при этом контролируются ИсключаемыеРегистры – регистры, движения по которым формируются не из модуля менеджера документа.

Например, документ реализации формирует движения по регистру «РасчетыСКлиентамиПоДокументам», но не в момент проведения, а в дальнейшем, при помощи регламентного задания, следовательно, регистр «РасчетыСКлиентамиПоДокументам» будет помещен в исключаемые и флагу записи останется присвоенное значение «Ложь».

4. Заполнение движений наборами записей

ЗаказыСервер.ОтразитьЗаказыКлиентов(ДополнительныеСвойства, Движения, Отказ);
ЗапасыСервер.ОтразитьСвободныеОстатки(ДополнительныеСвойства, Движения, Отказ);
ЗапасыСервер.ОтразитьОбеспечениеЗаказов(ДополнительныеСвойства, Движения, Отказ);
ЗаказыСервер.ОтразитьТоварыКОтгрузке(ДополнительныеСвойства, Движения, Отказ);

На этом этапе для каждого регистра таблицы значений с движениями выгружаются из дополнительных свойств в наборы записей регистров. Загрузка движений по каждому из регистров производится по одинаковому алгоритму, таблица движений из дополнительных свойств загружается в движения регистра.

ТаблицаЗаказыКлиентов = ДополнительныеСвойства.ТаблицыДляДвижений.ТаблицаЗаказыКлиентов;
…
ДвиженияЗаказыКлиентов.Загрузить(ТаблицаЗаказыКлиентов);

Результаты ранее выполненных запросов перенесены из таблиц значений в движения. Осталось только записать движения документа – рассмотрим это на следующем шаге.

5. Запись движений документа

ПроведениеСервер.ЗаписатьНаборыЗаписей(ЭтотОбъект);

Процедура формирует дополнительные параметры, которые будут доступны в модуле набора записей регистра (подготовка к процедуре контроля), а также выполняет запись движений. Движения записываются в единой последовательности, обеспечивается это тем, что производится запись сразу всей коллекции движений в рамках одной транзакции.

Объект.Движения.Записать();

Такой подход к записи движений устраняет возможные взаимоблокировки в информационной базе, так как ресурсы в транзакции имеют одинаковый порядок захвата.

6. Контроль отрицательных остатков

Движения записаны, настало время проверки результатов проведения.

Вызывается процедура СформироватьСписокРегистровДляКонтроля(), свойства объекта дополняются массивом РегистрыДляКонтроля. По каждому из регистров, находящихся в массиве, будет проведен контроль, за контроль отвечает процедура общего модуля:

ПроведениеСервер.ВыполнитьКонтрольРезультатовПроведения(ЭтотОбъект, Отказ);

В случае выявления несоответствий флаг Отказ будет возведен в «Истину» и проведение документа будет завершено с соответствующим диагностическим сообщением.

7. Очистка дополнительных свойств для проведения

Если на предыдущем шаге система не отказала в проведении, тогда выполняется закрытие менеджера временных таблиц в структуре дополнительных свойств документа, используемых при проведении. Сформированные и использованные ранее временные таблицы удаляются, т.к. документ уже практически проведен и нет смысла хранить избыточные данные.

ПроведениеСервер.ОчиститьДополнительныеСвойстваДляПроведения(ДополнительныеСвойства);

8. Дополнительные действия проведения

Завершающий этап обработки проведения документа. Выполняются дополнительные действия, связанные с объектом, и эти действия должны быть неразрывно связаны с моментом проведения документа, т.е. выполнены в транзакции проведения. Например, для документа реализации это актуализация счета-фактуры (приведение состояния счета-фактуры в соответствие с документом-основанием) и регистрация документа продажи, если по нему необходим счет-фактура.

Документы.СчетФактураВыданный.АктуализироватьСчетФактуру(ЭтотОбъект, Истина, ТребуетсяСчетФактура());
РегистрыСведений.ТребуетсяОформлениеСчетаФактуры.ОтразитьНеобходимостьОформленияСчетаФактуры(ДополнительныеСвойства, Отказ);

Документ реализации является сложным случаем и имеет дополнительные действия. В простом случае проведения дополнительных действий может и не быть.

Заключение

В статье рассмотрена схема проведения документа по регистрам учета в типовых конфигурациях УТ 11, КА 2 и ERP 2. Подведем краткие итоги:

Как понять алгоритм формирования движений в определенный регистр?

Алгоритм формирования движений содержится в тексте запроса, который расположен в функции ТекстЗапросаТаблица[ИмяРегистраДляДвижения] модуля менеджера объекта.

Как изменить алгоритм формирования движений в определенный регистр?

Требуется разработать свой текст запроса и поместить его вместо существующего в функцию ТекстЗапросаТаблица[ИмяРегистраДляДвижения] модуля менеджера объекта.

Такое решение подходит, если есть возможность изменять конфигурацию или использовать расширение конфигурации. В случае невозможности изменения конфигурации или использования расширений возможно реализовать функционал проведения через подписку на событие.

Как добавить формирование движений в свой новый регистр?

Требуется разработать текст запроса, формирующий движения, и поместить его в новую, нами созданную, функцию ТекстЗапросаТаблица[ИмяСвоегоНовогоРегистра] модуля менеджера объекта.

В модуле объекта добавить вызов процедуры Отразить[ИмяСвоегоНовогоРегистра] в обработке проведения документа. Текст процедуры формируется по аналогии с типовыми процедурами.

Как провести документ только по одному регистру?

Рассмотрим эмпирическую задачу: нам требуется провести документ реализации только по одному регистру накопления, например, «Свободные остатки». Достаточно создать внешнюю обработку и разместить в ней следующий программный код:

&НаСервереБезКонтекста
Процедура ПерепровестиДокументРеализацииПоРегиструСвободныеОстатки(РеализацияСсылка, Отказ)
 
	РеализацияОбъект = РеализацияСсылка.ПолучитьОбъект();
ПроведениеСервер.ИнициализироватьДополнительныеСвойстваДляПроведения(РеализацияСсылка, РеализацияОбъект.ДополнительныеСвойства, РежимПроведенияДокумента.Неоперативный);
      	Документы.РеализацияТоваровУслуг.ИнициализироватьДанныеДокумента(РеализацияСсылка, РеализацияОбъект.ДополнительныеСвойства);
        	ЗапасыСервер.ОтразитьСвободныеОстатки(РеализацияОбъект.ДополнительныеСвойства, РеализацияОбъект.Движения, Отказ);
        	РеализацияОбъект.Движения.Записать();
        	
КонецПроцедуры // ПерепровестиДокументРеализацииПоРегиструСвободныеОстатки()

Об авторе

PDF-версия статьи для участников группы ВКонтакте

Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.

Если Вы еще не вступили в нее – сделайте это сейчас, и в блоке ниже (на этой странице) появятся ссылки на скачивание материалов.

Если Вы уже участник группы – нужно просто повторно авторизоваться в ВКонтакте, чтобы скрипт Вас узнал. В случае проблем решение стандартное: очистить кэш браузера или подписаться через другой браузер.

Понравилась статья? Поделить с друзьями:
  • Колпино ветеринарная клиника возле кладбища часы работы
  • Колпино магазин ткани на фидерной в колпино часы работы
  • Колумбус на пражской часы работы в новогодние праздники
  • Колымская судоходная компания вакансии официальный сайт
  • Колюпаново тульская область святой источник часы работы