1. Необходимо изменить имеющееся проведение документа.
Рассмотрим на примере документа "Заказ клиента". Допустим в документе изменен алгоритм определения Назначения: в шапку документа добавлен дополнительный реквизит "допНазначение" с типом СправочникСсылка.Назначения. Если этот реквизит заполнен, то в движение регистра накопления "Обеспечение заказов" должно подставляться его значение, иначе должен выполняться типовой механизм документа.
Для начала следует отметить, что для всех документов в ERP сам алгоритм Обработки проведения вынесен в общий модуль "ПроведениеДокументов".
Модуль объекта документа ЗаказКлиента
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ); //<-- Здесь будет происходить само проведение
ЗаказКлиентаЛокализация.ОбработкаПроведения(ЭтотОбъект, Отказ, РежимПроведения);
РегистрыСведений.СостоянияЗаказовКлиентов.ОтразитьСостояниеЗаказа(Ссылка, Отказ);
ДоставкаТоваров.ОтразитьСостояниеДоставки(Ссылка, Отказ);
ПродажиСервер.ВыполнитьКонтрольЗаказаПослеПроведения(Ссылка, Отказ);
КонецПроцедуры
Но при этом получение данных для движений происходит в модуле менеджера самого документа, который должен быть проведен, в экспортной функции ДанныеДокументаДляПроведения.
Модуль менеджера документа ЗаказКлиента
// Возвращает таблицы для движений, необходимые для проведения документа по регистрам учетных механизмов.
//
// Параметры:
// Документ - ДокументСсылка - ссылка на документ, по которому необходимо получить данные
// Регистры - Структура - список имен регистров, для которых необходимо получить таблицы
// ДопПараметры - Структура - дополнительные параметры для получения данных, определяющие контекст проведения.
//
// Возвращаемое значение:
// Структура - коллекция элементов:
// * Таблица<ИмяРегистра> - ТаблицаЗначений - таблица данных для отражения в регистр.
//
Функция ДанныеДокументаДляПроведения(Документ, Регистры, ДопПараметры = Неопределено) Экспорт
Если ДопПараметры = Неопределено Тогда
ДопПараметры = ПроведениеДокументов.ДопПараметрыИнициализироватьДанныеДокументаДляПроведения();
КонецЕсли;
Запрос = Новый Запрос;
ТекстыЗапроса = Новый СписокЗначений;
Если Не ДопПараметры.ПолучитьТекстыЗапроса Тогда
////////////////////////////////////////////////////////////////////////////
// Создадим запрос инициализации движений
ЗаполнитьПараметрыИнициализации(Запрос, Документ);
////////////////////////////////////////////////////////////////////////////
// Сформируем текст запроса
СформироватьСуммыДокументаВВалютахУчета(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаЗаказыКлиентов(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаГрафикОтгрузкиТоваров(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаСвободныеОстатки(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаОбеспечениеЗаказов(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаОбеспечениеЗаказовРаботами(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаРеестрДокументов(Запрос, ТекстыЗапроса, Регистры);
КонецЕсли;
ДобавитьТекстыОтраженияВзаиморасчетов(Запрос, ТекстыЗапроса, Регистры);
ОтразитьРезерв(Запрос, ТекстыЗапроса, Регистры);
ЗапланироватьОтгрузкуТоваров(Запрос, ТекстыЗапроса, Регистры);
////////////////////////////////////////////////////////////////////////////
// Получим таблицы для движений
Возврат ПроведениеДокументов.ИнициализироватьДанныеДокументаДляПроведения(Запрос, ТекстыЗапроса, ДопПараметры);
КонецФункции
В рамках нашей задачи, нас будут интересовать функция "ТекстЗапросаТаблицаОбеспечениеЗаказов" и процедура "ЗаполнитьПараметрыИнициализации".
Функция "ТекстЗапросаТаблицаОбеспечениеЗаказов" возвращает текст запроса, результат которого будет выгружен в таблицу движений по регистру накопления "Обеспечение заказов". Поэтому важно при внесении изменений в этот запрос не изменять синонимы полей, иначе они не попадут в движения.
Добавим условие в текст запроса:
Модуль менеджера документа ЗаказКлиента
Функция ТекстЗапросаТаблицаОбеспечениеЗаказов(Запрос, ТекстыЗапроса, Регистры)
ИмяРегистра = "ОбеспечениеЗаказов";
Если НЕ ПроведениеДокументов.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
Возврат "";
КонецЕсли;
ТекстЗапроса =
// Формирование потребности
"ВЫБРАТЬ
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК ВидДвижения,
| &Период КАК Период,
| ТаблицаТовары.Склад КАК Склад,
| ТаблицаТовары.Номенклатура КАК Номенклатура,
| ТаблицаТовары.Характеристика КАК Характеристика,
//++ НАЧАЛО ДОРАБОТКИ -->
// Типовой код:
//| &Назначение КАК Назначение,
// Добавленный код:
| ВЫБОР
| КОГДА &допНазначение <> ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| ТОГДА &допНазначение
| ИНАЧЕ &Назначение
| КОНЕЦ КАК Назначение,
//-- КОНЕЦ ДОРАБОТКИ <--
| ТаблицаТовары.Количество КАК Потребность,
| ТаблицаТовары.Количество КАК КЗаказу,
| 0 КАК НаличиеПодЗаказ
|
|ИЗ
| Документ.ЗаказКлиента.Товары КАК ТаблицаТовары
|ГДЕ
| ТаблицаТовары.Ссылка = &Ссылка
| И НЕ ТаблицаТовары.Отменено
|
| И ТаблицаТовары.Номенклатура.ТипНоменклатуры В(
| ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар),
| ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара))
|
| И ТаблицаТовары.ВариантОбеспечения В(
| ЗНАЧЕНИЕ(Перечисление.ВариантыОбеспечения.Обособленно),
| ЗНАЧЕНИЕ(Перечисление.ВариантыОбеспечения.ОтгрузитьОбособленно))
|
| И &Статус В(
| ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.КОбеспечению),
| ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.КОтгрузке),
| ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.Закрыт))
|
|ОБЪЕДИНИТЬ ВСЕ
|
// Закрытие потребности
|ВЫБРАТЬ
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК ВидДвижения,
| &Период КАК Период,
| ТаблицаТовары.Склад КАК Склад,
| ТаблицаТовары.Номенклатура КАК Номенклатура,
| ТаблицаТовары.Характеристика КАК Характеристика,
//++ НАЧАЛО ДОРАБОТКИ -->
// Типовой код:
//| &Назначение КАК Назначение,
// Добавленный код:
| ВЫБОР
| КОГДА &допНазначение <> ЗНАЧЕНИЕ(Справочник.Назначения.ПустаяСсылка)
| ТОГДА &допНазначение
| ИНАЧЕ &Назначение
| КОНЕЦ КАК Назначение,
//-- КОНЕЦ ДОРАБОТКИ <--
| ТаблицаТовары.Количество КАК Потребность,
| 0 КАК КЗаказу,
| ТаблицаТовары.Количество КАК НаличиеПодЗаказ
|
|ИЗ
| Документ.ЗаказКлиента.Товары КАК ТаблицаТовары
|ГДЕ
| ТаблицаТовары.Ссылка = &Ссылка
| И НЕ ТаблицаТовары.Отменено
|
| И ТаблицаТовары.Номенклатура.ТипНоменклатуры В(
| ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар),
| ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.МногооборотнаяТара))
|
| И ТаблицаТовары.ВариантОбеспечения = ЗНАЧЕНИЕ(Перечисление.ВариантыОбеспечения.ОтгрузитьОбособленно)
|
| И &Статус В(
| ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.КОбеспечению),
| ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.КОтгрузке),
| ЗНАЧЕНИЕ(Перечисление.СтатусыЗаказовКлиентов.Закрыт))";
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
Возврат ТекстЗапроса;
КонецФункции
Чтобы минимизировать количество таблиц базы данных, к которым идет обращение в запросе, все необходимые реквизиты "шапки" документа получаются отдельным запросом и помещаются в параметры запроса в процедуре "ЗаполнитьПараметрыИнициализации".
Определим наш добавленный реквизит как параметр запроса:
Модуль менеджера документа ЗаказКлиента
Процедура ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка)
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеШапки.Дата КАК Период,
| ДанныеШапки.Партнер КАК Партнер,
| ДанныеШапки.Контрагент КАК Контрагент,
| ДанныеШапки.Организация КАК Организация,
| ДанныеШапки.Валюта КАК Валюта,
| ДанныеШапки.Склад КАК Склад,
| ДанныеШапки.Статус КАК Статус,
| ДанныеШапки.Ссылка КАК ЗаказКлиента,
| ДанныеШапки.ЦенаВключаетНДС КАК ЦенаВключаетНДС,
| ДанныеШапки.ХозяйственнаяОперация КАК ХозяйственнаяОперация,
| ДанныеШапки.Договор КАК Договор,
| ДанныеШапки.Назначение КАК Назначение,
| ДанныеШапки.Подразделение КАК Подразделение,
//++ НАЧАЛО ДОРАБОТКИ -->
| ДанныеШапки.допНазначение КАК допНазначение,
//-- КОНЕЦ ДОРАБОТКИ <--
|
| ВЫБОР КОГДА ДанныеШапки.ПорядокРасчетов = ЗНАЧЕНИЕ(Перечисление.ПорядокРасчетов.ПоДоговорамКонтрагентов) ТОГДА
| ИСТИНА
| ИНАЧЕ
| ЛОЖЬ
| КОНЕЦ КАК РасчетыПоДоговорам,
| ЕСТЬNULL(ДанныеШапки.Договор.ДопустимаяСуммаЗадолженности, 0) КАК ДопустимаяСуммаЗадолженности,
| ДанныеШапки.НаправлениеДеятельности КАК НаправлениеДеятельности,
| ВЫБОР КОГДА ДанныеШапки.ПорядокРасчетов = ЗНАЧЕНИЕ(Перечисление.ПорядокРасчетов.ПоДоговорамКонтрагентов)
| И ЕСТЬNULL(ДанныеШапки.Договор.ЗаданГрафикИсполнения, ЛОЖЬ) ТОГДА
| ИСТИНА
| ИНАЧЕ
| ЛОЖЬ
| КОНЕЦ КАК ГрафикИсполненияВДоговоре,
| ДанныеШапки.Номер КАК Номер,
| ДанныеШапки.Комментарий КАК Комментарий,
| ДанныеШапки.СуммаДокумента КАК СуммаДокумента,
| ДанныеШапки.Проведен КАК Проведен,
| ДанныеШапки.ПометкаУдаления КАК ПометкаУдаления,
| ДанныеШапки.НомерПоДаннымКлиента КАК НомерПоДаннымКлиента,
| ДанныеШапки.ДатаПоДаннымКлиента КАК ДатаПоДаннымКлиента,
| ДанныеШапки.Менеджер КАК Менеджер
|
|ИЗ
| Документ.ЗаказКлиента КАК ДанныеШапки
|ГДЕ
| ДанныеШапки.Ссылка = &Ссылка";
Реквизиты = Запрос.Выполнить().Выбрать();
Реквизиты.Следующий();
Запрос.УстановитьПараметр("Период", Реквизиты.Период);
Запрос.УстановитьПараметр("ЗаказКлиента", Реквизиты.ЗаказКлиента);
Запрос.УстановитьПараметр("Период", Реквизиты.Период);
Запрос.УстановитьПараметр("Склад", Реквизиты.Склад);
Запрос.УстановитьПараметр("Партнер", Реквизиты.Партнер);
Запрос.УстановитьПараметр("Валюта", Реквизиты.Валюта);
Запрос.УстановитьПараметр("Статус", Реквизиты.Статус);
Запрос.УстановитьПараметр("Организация", Реквизиты.Организация);
Запрос.УстановитьПараметр("ЦенаВключаетНДС", Реквизиты.ЦенаВключаетНДС);
Запрос.УстановитьПараметр("Назначение", Реквизиты.Назначение);
Запрос.УстановитьПараметр("Подразделение", Реквизиты.Подразделение);
Запрос.УстановитьПараметр("ХозяйственнаяОперация", Реквизиты.ХозяйственнаяОперация);
Запрос.УстановитьПараметр("Договор", Реквизиты.Договор);
Запрос.УстановитьПараметр("РасчетыПоДоговорам", Реквизиты.РасчетыПоДоговорам);
Запрос.УстановитьПараметр("ИспользоватьПострочнуюОтгрузкуВЗаказеКлиента",
ПолучитьФункциональнуюОпцию("ИспользоватьПострочнуюОтгрузкуВЗаказеКлиента"));
Запрос.УстановитьПараметр("ДопустимаяСуммаЗадолженности", Реквизиты.ДопустимаяСуммаЗадолженности);
Запрос.УстановитьПараметр("ГрафикИсполненияВДоговоре", Реквизиты.ГрафикИсполненияВДоговоре);
Запрос.УстановитьПараметр("Контрагент", Реквизиты.Контрагент);
Запрос.УстановитьПараметр("НаправлениеДеятельности", Реквизиты.НаправлениеДеятельности);
Запрос.УстановитьПараметр("Номер", Реквизиты.Номер);
Запрос.УстановитьПараметр("Менеджер", Реквизиты.Менеджер);
Запрос.УстановитьПараметр("Комментарий", Реквизиты.Комментарий);
Запрос.УстановитьПараметр("Проведен", Реквизиты.Проведен);
Запрос.УстановитьПараметр("ПометкаУдаления", Реквизиты.ПометкаУдаления);
Запрос.УстановитьПараметр("ДатаПоДаннымКлиента", Реквизиты.ДатаПоДаннымКлиента);
Запрос.УстановитьПараметр("НомерПоДаннымКлиента", Реквизиты.НомерПоДаннымКлиента);
Запрос.УстановитьПараметр("СуммаДокумента", Реквизиты.СуммаДокумента);
Запрос.УстановитьПараметр("ИдентификаторМетаданных", ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипЗнч(ДокументСсылка)));
Запрос.УстановитьПараметр("ХозОперацииПередачиТоваров", ПродажиСервер.ОперацииПередачиТоваров());
//++ НАЧАЛО ДОРАБОТКИ -->
Запрос.УстановитьПараметр("допНазначение", Реквизиты.допНазначение);
//-- КОНЕЦ ДОРАБОТКИ <--
ИнформацияПоДоговору = Неопределено;
Если ЗначениеЗаполнено(Реквизиты.Договор) Тогда
ИнформацияПоДоговору = НСтр("ru = 'По договору ""%Договор%""';
|en = 'Under the ""%Договор%"" contract'", ОбщегоНазначенияКлиентСервер.КодОсновногоЯзыка());
ИнформацияПоДоговору = СтрЗаменить(ИнформацияПоДоговору, "%Договор%", Реквизиты.Договор);
КонецЕсли;
Запрос.УстановитьПараметр("ИнформацияПоДоговору", ИнформацияПоДоговору);
КонецПроцедуры
На этом доработка по первому пункту статьи окончена.
2. Необходимо сделать записи в существующие или новые регистры.
Чтобы разобраться с этим вопросом, рассмотрим ситуацию когда в конфигурацию добавлен новый документ и новые регистры, и нам необходимо реализовать проведение как у "типовых" документов.
В "ERP Управление предприятием 2" учет драгоценных металлов реализован довольно скудно: их содержание в номенклатуре указывается непосредственно в табличной части самой номенклатуры. И, если с разными партиями нам приходит товар с разным содержанием драгметаллов, то отразить такую ситуацию в системе мы не сможем. Я буду показывать не полный бизнес процесс, а урезанный, которого должно хватить для демонстрации. Добавим в конфигурацию новый документ "ДвижениеДрагметаллов" с двумя табличными частями:
Структура метаданных табличных частей
Товары
- Номенклатура
- Количество
- ИдентификаторСтроки (для связи ТЧ)
Драгметаллы
- Драгметалл
- Количество
- ИдентификаторСтроки (для связи ТЧ)
И два регистра накопления:
Структура метаданных регистров
ОстаткиДрагметаллов
Измерения
- Номенклатура
- Драгметалл
Ресурсы
- Количество
- КоличествоДрагметалла
ДрагметаллыВИзделиях ("оборотный")
Измерения
- Номенклатура
- Драгметалл
Ресурсы
- Количество
Теперь рассмотрим цепочку проведения нового документа.
В ERP проведение начинается не с процедуры ОбработкаПроведения, а с процедур ПередЗаписью и ПриЗаписи.
Модуль объекта документа ДвижениеДрагметаллов
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
ПроведениеДокументов.ПередЗаписьюДокумента(ЭтотОбъект, РежимЗаписи, РежимПроведения);
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
Если ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
ПроведениеДокументов.ПриЗаписиДокумента(ЭтотОбъект, Отказ);
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
КонецПроцедуры
В процедуре ПередЗаписью "ДополнительныеСвойства" документа заполняются служебными значениями
Общий модуль ПроведениеДокументов
// Инициализирует в обработчике документа ПередЗаписью() свойства, необходимые для проведения документа.
//
// Параметры:
// Документ - ДокументОбъект - записываемый документ
// РежимЗаписи - РежимЗаписиДокумента - текущий режим проведения документа
// РежимПроведения - РежимПроведенияДокумента - текущий режим проведения документа.
//
Процедура ПередЗаписьюДокумента(Документ, РежимЗаписи, РежимПроведения) Экспорт
Если Документ.Проведен И РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
РежимПроведения = РежимПроведенияДокумента.Неоперативный;
КонецЕсли;
Документ.ДополнительныеСвойства.Вставить("ПроведениеДокументов", Новый Структура);
СвойстваДокумента = Новый ФиксированнаяСтруктура("ЭтоНовый, РежимЗаписи, РежимПроведения, Проведен",
Документ.ЭтоНовый(),
РежимЗаписи,
РежимПроведения,
Документ.Проведен);
Документ.ДополнительныеСвойства.ПроведениеДокументов.Вставить("СвойстваДокумента", СвойстваДокумента);
Документ.ДополнительныеСвойства.ПроведениеДокументов.Вставить("ТаблицыКонтроля", Новый Структура);
КонецПроцедуры
В процедуре ПриЗаписи реализован механизм записи движений по независимым регистрам сведений, если документ записывается не в режиме "Проведение". Например, запись в регистр сведений "РеестрДокументов" происходит таким образом.
Общий модуль ПроведениеДокументов
// Формирует в обработчике документа ПриЗаписи() движения по независимым регистрам, определенных в учетных документах.
//
// Параметры:
// Документ - ДокументОбъект - записываемый документ
// Отказ - Булево - признак отказа от записи.
//
Процедура ПриЗаписиДокумента(Документ, Отказ) Экспорт
Если СвойстваДокумента(Документ).РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Возврат;
КонецЕсли;
ЗаписатьДокумент(Документ, Отказ);
КонецПроцедуры
Процедура ЗаписатьДокумент(Документ, Отказ)
УстановитьПривилегированныйРежим(Истина);
Свойства = СвойстваДокумента(Документ);
МенеджерДокумента = Документы[Документ.Метаданные().Имя];
ПроведениеДокументовЛокализация.ПереназначитьМодульПолученияДанныхДокумента(МенеджерДокумента);
МеханизмыДокумента = УчетныеМеханизмыДокумента(МенеджерДокумента);
МеханизмыКонфигурации = УчетныеМеханизмыКонфигурации();
ДвижимыеРегистры = Новый Структура;
Механизмы = Новый СписокЗначений;
Для каждого Механизм Из МеханизмыДокумента Цикл
МодульМеханизма = ОбщегоНазначения.ОбщийМодуль(МеханизмыКонфигурации[Механизм]);
ПараметрыМеханизма = МодульМеханизма.ПараметрыДляПроведенияДокумента(Документ, Свойства); // см. ПроведениеДокументов.ПараметрыУчетногоМеханизма -
ПараметрыМеханизма.Вставить("МодульМеханизма", МодульМеханизма);
Для каждого Регистр Из ПараметрыМеханизма.НезависимыеРегистры Цикл
ДвижимыеРегистры.Вставить(Регистр.Имя);
КонецЦикла;
Механизмы.Добавить(ПараметрыМеханизма, Механизм);
КонецЦикла;
Механизмы.СортироватьПоПредставлению();
ТаблицыДляДвижений = ТаблицыДляДвижений(Документ, МенеджерДокумента, ДвижимыеРегистры, Неопределено);
ЗаписатьДвиженияНезависимыхРегистров(Механизмы, Документ, ТаблицыДляДвижений, Отказ);
КонецПроцедуры
Давайте разберемся что такое Учетные механизмы и как их использовать.
Все регистры конфигурации (РС, РН, РР, РБ) сгруппированы в некие смысловые области - Учетные механизмы - в которых описывается по каким регистрам необходимо произвести движения, контроль движений, а также отложенные движения. Один учетный механизм может использоваться для нескольких документов. В функции "УчетныеМеханизмыКонфигурации" общего модуля "ПроведениеДокументов" хранятся все возможные механизмы конфигурации, а затем в модуле менеджера документа указывается его принадлежность к конкретным учетным механизмам.
Таким образом, чтобы выполнить запись в добавленные регистры, сперва необходимо добавить новый Учетный механизм
Общий модуль ПроведениеДокументов
// Описывает учетные механизмы используемые в конфигурации.
//
Функция УчетныеМеханизмыКонфигурации()
МеханизмыКонфигурации = Новый Структура;
... //Тут описаны типовые механизмы
//++ НАЧАЛО ДОРАБОТКИ -->
// Ключ - Имя механизма, Значение - модуль реализующий интерфейс проведения
МеханизмыКонфигурации.Вставить("УчетДрагметаллов", "УчетДрагметаллов");
//-- КОНЕЦ ДОРАБОТКИ <--
Возврат МеханизмыКонфигурации;
КонецФункции
Добавим новый общий модуль "УчетДрагметаллов"
Общий модуль УчетДрагметаллов
// Формирует параметры для проведения документа по регистрам учетного механизма через общий механизм проведения.
//
// Параметры:
// Документ - ДокументОбъект - записываемый документ
// Свойства - ФиксированнаяСтруктура - свойства документа (См. ПроведениеДокументов.СвойстваДокумента).
//
// Возвращаемое значение:
// Структура - параметры учетного механизма (См. ПроведениеДокументов.ПараметрыУчетногоМеханизма()).
//
Функция ПараметрыДляПроведенияДокумента(Документ, Свойства) Экспорт
Параметры = ПроведениеДокументов.ПараметрыУчетногоМеханизма();
// Проведение
Если Свойства.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Параметры.ПодчиненныеРегистры.Добавить(Метаданные.РегистрыНакопления.ОстаткиДрагметаллов);
Параметры.ПодчиненныеРегистры.Добавить(Метаданные.РегистрыНакопления.ДрагметаллыВИзделиях);
КонецЕсли;
// Контроль
Если Свойства.РежимЗаписи <> РежимЗаписиДокумента.Запись Тогда
Параметры.КонтрольныеРегистрыИзменений.Добавить(Метаданные.РегистрыНакопления.ОстаткиДрагметаллов);
КонецЕсли;
Возврат Параметры;
КонецФункции
// Процедура формирования движений по подчиненным регистрам
//
// Параметры:
// ТаблицыДляДвижений - Структура - таблицы данных документа
// Движения - КоллекцияДвижений - коллекция наборов записей движений документа
// Отказ - Булево - признак отказа от проведения документа.
//
Процедура ОтразитьДвижения(ТаблицыДляДвижений, Движения, Отказ) Экспорт
Если Отказ Тогда
Возврат;
КонецЕсли;
ПроведениеДокументов.ОтразитьДвижения(ТаблицыДляДвижений, Движения, "ОстаткиДрагметаллов");
ПроведениеДокументов.ОтразитьДвижения(ТаблицыДляДвижений, Движения, "ДрагметаллыВИзделиях");
КонецПроцедуры
// Формирует тексты запросов для контроля изменений записанных движений регистров.
//
// Параметры:
// Запрос - Запрос - запрос, хранящий параметры используемые в списке запросов
// ТекстыЗапроса - СписокЗначений - список текстов запросов и их имен.
// Документ - ДокументОбъект - записываемый документ.
//
Процедура ИнициализироватьДанныеКонтроляИзменений(Запрос, ТекстыЗапроса, Документ) Экспорт
Если ПроведениеДокументов.ЕстьЗаписиВТаблице(Документ, "ДвиженияОстаткиДрагметалловИзменение") Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| ТаблицаОстатков.Номенклатура КАК Номенклатура,
| ТаблицаОстатков.Драгметалл КАК Драгметалл,
| ТаблицаОстатков.КоличествоОстаток КАК Количество,
| 0 КАК КоличествоДрагметаллов
|ИЗ
| РегистрНакопления.ИС_ОстаткиДрагметаллов.Остатки(
| ,
| (Номенклатура, Драгметалл) В
| (ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Драгметалл КАК Драгметалл
| ИЗ
| ДвиженияОстаткиДрагметалловИзменение КАК Таблица)) КАК ТаблицаОстатков
|ГДЕ
| ТаблицаОстатков.КоличествоОстаток < 0
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ТаблицаОстатков.Номенклатура,
| ТаблицаОстатков.Драгметалл,
| 0,
| ТаблицаОстатков.КоличествоДрагметалловОстаток
|ИЗ
| РегистрНакопления.ИС_ОстаткиДрагметаллов.Остатки(
| ,
| (Номенклатура, Драгметалл) В
| (ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Драгметалл КАК Драгметалл
| ИЗ
| ДвиженияОстаткиДрагметалловИзменение КАК Таблица)) КАК ТаблицаОстатков
|ГДЕ
| ТаблицаОстатков.КоличествоДрагметалловОстаток < 0";
ТекстыЗапроса.Добавить(ТекстЗапроса, "ОшибкиОстаткиДрагметаллов");
КонецЕсли;
КонецПроцедуры
// Выводит сообщения пользователю при наличии ошибок контроля изменений записанных движений регистров.
//
// Параметры:
// РезультатыКонтроля - Структура - таблицы с результатами контроля изменений
// Документ - ДокументОбъект - записываемый документ
// Отказ - Булево - признак отказа от проведения документа.
//
Процедура СообщитьОРезультатахКонтроляИзменений(РезультатыКонтроля, Документ, Отказ) Экспорт
Если ПроведениеДокументов.ЕстьЗаписиВТаблице(Документ, "ДвиженияОстаткиДрагметалловИзменение") Тогда
ШаблонСообщенияНоменклатуры = НСтр("ru = 'Номенклатура %1 списывается больше чем есть на остатках на %2'");
ШаблонСообщенияДрагметаллов = НСтр("ru = 'Драгметалл %1 списывается больше чем есть на остатках на %2'");
Для каждого СтрокаОшибки Из РезультатыКонтроля.ОшибкиОстаткиДрагметаллов Цикл
Если ЗначениеЗаполнено(СтрокаОшибки.Количество) Тогда
Номенклатура = СтрокаОшибки.Номенклатура;
Иначе
Номенклатура = СтрокаОшибки.Драгметалл;
КонецЕсли;
ПредставлениеНоменклатуры = НоменклатураКлиентСервер.ПредставлениеНоменклатуры(Номенклатура);
Если ЗначениеЗаполнено(СтрокаОшибки.Количество) Тогда
ТекстСообщения = СтрШаблон(ШаблонСообщенияНоменклатуры, ПредставлениеНоменклатуры, -СтрокаОшибки.Количество);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, Документ,,, Отказ);
КонецЕсли;
Если ЗначениеЗаполнено(СтрокаОшибки.КоличествоДрагметаллов) Тогда
ТекстСообщения = СтрШаблон(ШаблонСообщенияДрагметаллов, ПредставлениеНоменклатуры, -СтрокаОшибки.КоличествоДрагметаллов);
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, Документ,,, Отказ);
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
В функции "ПараметрыДляПроведенияДокумента" вызывается функция-конструктор "ПараметрыУчетногоМеханизма", с помощью которой определяется взаимодействие данного механизма с регистрами конфигурации.
Общий модуль ПроведениеДокументов
// Функция-конструктор параметров учетного механизма.
//
// Возвращаемое значение:
// Структура - со свойствами:
// * НезависимыеРегистры - Массив Из ОбъектМетаданныхРегистрСведений -
// * ПодчиненныеРегистры - Массив Из ОбъектМетаданныхРегистрСведений -
// - Массив Из ОбъектМетаданныхРегистрНакопления -
// - Массив Из ОбъектМетаданныхРегистрБухгалтерии -
// - Массив Из ОбъектМетаданныхРегистрРасчета - список подчиненных регистратору регистров, который записываются учетным механизмом.
// * КонтрольныеРегистрыИзменений - Массив Из ОбъектМетаданныхРегистрСведений -
// - Массив Из ОбъектМетаданныхРегистрНакопления -
// - Массив Из ОбъектМетаданныхРегистрБухгалтерии -
// - Массив Из ОбъектМетаданныхРегистрРасчета - список подчиненных регистратору регистров,
// по которым необходимо контролировать изменения.
// * КонтрольныеРегистрыЗаданий - Массив Из ОбъектМетаданныхРегистрСведений -
// - Массив Из ОбъектМетаданныхРегистрНакопления -
// - Массив Из ОбъектМетаданныхРегистрБухгалтерии -
// - Массив Из ОбъектМетаданныхРегистрРасчета - список подчиненных регистратору регистров,
// по изменению которых необходимо формировать задания.
// * Производный - Булево - формируются вторичные движения используя данные уже записанных регистров,
// сделанных в том числе другими механизмами.
//
Функция ПараметрыУчетногоМеханизма() Экспорт
Параметры = Новый Структура;
Параметры.Вставить("НезависимыеРегистры", Новый Массив);
Параметры.Вставить("ПодчиненныеРегистры", Новый Массив);
Параметры.Вставить("КонтрольныеРегистрыИзменений", Новый Массив);
Параметры.Вставить("КонтрольныеРегистрыЗаданий", Новый Массив);
Параметры.Вставить("Производный", Ложь);
Возврат Параметры;
КонецФункции
(КонтрольныеРегистрыЗаданий - это регистры, по которым необходимо произвести отложенные движения)
(Если возвести флаг параметра "Производный" в Истина, то в модуле механизма обязательно необходимо описать процедуры "ПередЗаписьюДвиженийДокумента" и "ПослеЗаписиДвиженийДокумента". Приведу пример из учетного механизма "ОперативныйУчетТоваровОрганизаций")
Общий модуль ЗапасыСервер (ОперативныйУчетТоваровОрганизаций)
// Возникает перед выполнением записи регистров документа.
//
// Параметры:
// Документ - ДокументОбъект - записываемый документ
// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - менеджер временных таблиц,
// используемый для хранения таблиц контроля изменений регистров
// Отказ - Булево - признак отказа от проведения документа.
//
Процедура ПередЗаписьюДвиженийДокумента(Документ, МенеджерВременныхТаблиц, Отказ) Экспорт
// Отключение стандартной очистки движений
Если Документ.Движения.РезервыТоваровОрганизаций.Записывать
И (Не Документ.ДополнительныеСвойства.Свойство("ЗаписыватьРезервыТоваровОрганизацийВместеСоВсеми")
Или Не Документ.ДополнительныеСвойства.ЗаписыватьРезервыТоваровОрганизацийВместеСоВсеми) Тогда
Документ.Движения.РезервыТоваровОрганизаций.Записывать = Ложь;
КонецЕсли;
Если Документ.ДополнительныеСвойства.Свойство("ПараметрыЗаполненияВидовЗапасов") Тогда
Если Документ.ДополнительныеСвойства.ПараметрыЗаполненияВидовЗапасов = "ПолучитьПередПодготовкой" Тогда
Документ.ДополнительныеСвойства.ПараметрыЗаполненияВидовЗапасов
= Документ.ПараметрыЗаполненияВидовЗапасов(МенеджерВременныхТаблиц);
КонецЕсли;
РежимЗаписи = ПроведениеДокументов.СвойстваДокумента(Документ).РежимЗаписи;
Если Документ.ДополнительныеСвойства.Свойство("ИспользоватьПриПодготовкеПараметрыЗаполненияВидовЗапасов") Тогда
ПараметрыЗаполнения = Документ.ДополнительныеСвойства.ПараметрыЗаполненияВидовЗапасов;
Иначе
ПараметрыЗаполнения = Неопределено;
КонецЕсли;
ПодготовитьЗаписьТоваровОрганизаций(Документ, МенеджерВременныхТаблиц, РежимЗаписи, ПараметрыЗаполнения);
КонецЕсли;
КонецПроцедуры
// Возникает после выполнения записи регистров документа.
//
// Параметры:
// Документ - ДокументОбъект - записываемый документ
// МенеджерВременныхТаблиц - МенеджерВременныхТаблиц - менеджер временных таблиц,
// используемый для хранения таблиц контроля изменений регистров
// Отказ - Булево - признак отказа от проведения документа.
//
Процедура ПослеЗаписиДвиженийДокумента(Документ, МенеджерВременныхТаблиц, Отказ) Экспорт
ПараметрыЗаполнения = Неопределено;
Если Документ.ДополнительныеСвойства.Свойство("ПараметрыЗаполненияВидовЗапасов", ПараметрыЗаполнения) Тогда
Если ПараметрыЗаполнения = "ПолучитьПередФормированием" Тогда
ПараметрыЗаполнения = Документ.ПараметрыЗаполненияВидовЗапасов(МенеджерВременныхТаблиц);
КонецЕсли;
Если ТипЗнч(ПараметрыЗаполнения) = Тип("Структура") Тогда
СформироватьРезервыПоТоварамОрганизаций(Документ, МенеджерВременныхТаблиц, Отказ, ПараметрыЗаполнения);
Иначе // коллекция
Для Каждого ЭлементКоллекции Из ПараметрыЗаполнения Цикл
СформироватьРезервыПоТоварамОрганизаций(Документ, МенеджерВременныхТаблиц, Отказ, ЭлементКоллекции);
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В процедуре "ОтразитьДвижения" выполняется запись движений по подчиненным регистрам. Запись вынесена в отдельную процедуру "ОтразитьДвижения" общего модуля "ПроведениеДокументов"
Общий модуль ПроведениеДокументов
// Загружает для записи данные в набор записей движений документа по указанному регистру.
//
// Параметры:
// ТаблицыДляДвижений - Структура - список таблиц для движений, содержащий таблицу данных для указанного регистра,
// с колонками соответствующие полям регистра и именем в формате "Таблица" + ИмяРегистра
// Движения - КоллекцияДвижений - коллекция наборов записей движений документа
// ИмяРегистра - Строка - имя регистра, данные которого необходимо загрузить.
//
Процедура ОтразитьДвижения(ТаблицыДляДвижений, Движения, ИмяРегистра) Экспорт
ИмяТаблицыДвижений = "Таблица" + ИмяРегистра;
Если ТаблицыДляДвижений.Свойство(ИмяТаблицыДвижений)
И ЗначениеЗаполнено(ТаблицыДляДвижений[ИмяТаблицыДвижений]) Тогда
Движения[ИмяРегистра].Записывать = Истина;
Движения[ИмяРегистра].Загрузить(ТаблицыДляДвижений[ИмяТаблицыДвижений]);
КонецЕсли;
КонецПроцедуры
Контроль движений реализован следующий образом:
Для всех регистров, которые указаны в параметре "КонтрольныеРегистрыИзменений", в модуле набора записей регистра проверяется изменение движений ДО и ПОСЛЕ записи, чтобы не проводить "лишний" контроль.
Модуль набора записей регистра накопления ОстаткиДрагметаллов
Процедура ПередЗаписью(Отказ, Замещение)
Если ОбменДанными.Загрузка Или Не ПроведениеДокументов.РассчитыватьИзменения(ДополнительныеСвойства) Тогда
Возврат;
КонецЕсли;
БлокироватьДляИзменения = Истина;
// Текущее состояние набора помещается во временную таблицу "ДвиженияОстаткиДрагметалловПередЗаписью",
// чтобы при записи получить изменение нового набора относительно текущего.
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Регистратор", Отбор.Регистратор.Значение);
Запрос.УстановитьПараметр("ЭтоНовый", ДополнительныеСвойства.СвойстваДокумента.ЭтоНовый);
Запрос.МенеджерВременныхТаблиц = ДополнительныеСвойства.МенеджерВременныхТаблиц;
Запрос.Текст =
"ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Драгметалл КАК Драгметалл,
| ВЫБОР
| КОГДА Таблица.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
| ТОГДА Таблица.Количество
| ИНАЧЕ -Таблица.Количество
| КОНЕЦ КАК КоличествоПередЗаписью,
| ВЫБОР
| КОГДА Таблица.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
| ТОГДА Таблица.КоличествоДрагметаллов
| ИНАЧЕ -Таблица.КоличествоДрагметаллов
| КОНЕЦ КАК КоличествоДрагметалловПередЗаписью
|ПОМЕСТИТЬ ДвиженияОстаткиДрагметалловПередЗаписью
|ИЗ
| РегистрНакопления.ОстаткиДрагметаллов КАК Таблица
|ГДЕ
| Таблица.Регистратор = &Регистратор
| И НЕ &ЭтоНовый";
Запрос.Выполнить();
КонецПроцедуры
Процедура ПриЗаписи(Отказ, Замещение)
Если ОбменДанными.Загрузка Или Не ПроведениеДокументов.РассчитыватьИзменения(ДополнительныеСвойства) Тогда
Возврат;
КонецЕсли;
// Рассчитывается изменение нового набора относительно текущего с учетом накопленных изменений
// и помещается во временную таблицу.
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("Регистратор", Отбор.Регистратор.Значение);
Запрос.МенеджерВременныхТаблиц = ДополнительныеСвойства.МенеджерВременныхТаблиц;
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаИзменений.Номенклатура КАК Номенклатура,
| ТаблицаИзменений.Драгметалл КАК Драгметалл,
| СУММА(ТаблицаИзменений.Количество) КАК Количество,
| СУММА(ТаблицаИзменений.КоличествоДрагметаллов) КАК КоличествоДрагметаллов
|ПОМЕСТИТЬ ДвиженияОстаткиДрагметалловИзменение
|ИЗ
| (ВЫБРАТЬ
| Таблица.Номенклатура КАК Номенклатура,
| Таблица.Драгметалл КАК Драгметалл,
| Таблица.Подразделение КАК Подразделение,
| Таблица.КоличествоПередЗаписью КАК Количество,
| Таблица.КоличествоДрагметалловПередЗаписью КАК КоличествоДрагметаллов
| ИЗ
| ДвиженияОстаткиДрагметалловПередЗаписью КАК Таблица
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| Таблица.Номенклатура,
| Таблица.Драгметалл,
| ВЫБОР
| КОГДА Таблица.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
| ТОГДА -Таблица.Количество
| ИНАЧЕ Таблица.Количество
| КОНЕЦ,
| ВЫБОР
| КОГДА Таблица.ВидДвижения = ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход)
| ТОГДА -Таблица.КоличествоДрагметаллов
| ИНАЧЕ Таблица.КоличествоДрагметаллов
| КОНЕЦ
| ИЗ
| РегистрНакопления.ОстаткиДрагметаллов КАК Таблица
| ГДЕ
| Таблица.Регистратор = &Регистратор) КАК ТаблицаИзменений
|
|СГРУППИРОВАТЬ ПО
| ТаблицаИзменений.Номенклатура,
| ТаблицаИзменений.Драгметалл
|
|ИМЕЮЩИЕ
| (СУММА(ТаблицаИзменений.Количество) <> 0
| ИЛИ СУММА(ТаблицаИзменений.КоличествоДрагметаллов) <> 0)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|УНИЧТОЖИТЬ ДвиженияОстаткиДрагметалловПередЗаписью";
МассивРезультатовЗапроса = Запрос.ВыполнитьПакет();
РезультатЗапроса = МассивРезультатовЗапроса[0]; // РезультатЗапроса
Выборка = РезультатЗапроса.Выбрать();
ЕстьИзменения = Выборка.Следующий() И Выборка.Количество > 0;
ПроведениеДокументов.ЗарегистрироватьТаблицуКонтроля(ДополнительныеСвойства,
"ДвиженияОстаткиДрагметалловИзменение", ЕстьИзменения);
КонецПроцедуры
Если это первое проведение документа или данные для проведения изменились, то контроль осуществляется в модуле механизма в процедуре "ИнициализироватьДанныеКонтроляИзменений". А возведения флага отказа от проведения и сообщения пользователю описываются в модуле механизма в процедуре "СообщитьОРезультатахКонтроляИзменений".
Движение по независимым регистрам сведений рассмотрим на примере Реестра документов.
В конфигурации уже определен соответствующий Учетный механизм:
Общий модуль ПроведениеДокументов
// Описывает учетные механизмы используемые в конфигурации.
//
Функция УчетныеМеханизмыКонфигурации()
...
МеханизмыКонфигурации.Вставить("РеестрДокументов", "РегистрыСведений.РеестрДокументов");
...
Возврат МеханизмыКонфигурации;
КонецФункции
Модуль менеджера регистра сведений РеестрДокументов
// Формирует параметры для проведения документа по регистрам учетного механизма через общий механизм проведения.
//
// Параметры:
// Документ - ДокументОбъект - записываемый документ
// Свойства - ФиксированнаяСтруктура - свойства документа (См. ПроведениеДокументов.СвойстваДокумента).
//
// Возвращаемое значение:
// Структура - параметры учетного механизма (См. ПроведениеДокументов.ПараметрыУчетногоМеханизма()).
//
Функция ПараметрыДляПроведенияДокумента(Документ, Свойства) Экспорт
Параметры = ПроведениеДокументов.ПараметрыУчетногоМеханизма();
Параметры.НезависимыеРегистры.Добавить(Метаданные.РегистрыСведений.РеестрДокументов);
Возврат Параметры;
КонецФункции
// Процедура формирования движений по регистру.
//
// Параметры:
// ТаблицыДляДвижений - Структура - таблицы данных документа
// Документ - ДокументСсылка - ссылка на документ
// Отказ - Булево - признак отказа от проведения документа.
//
Процедура ЗаписатьДанные(ТаблицыДляДвижений, Документ, Отказ) Экспорт
Если Отказ Тогда
Возврат;
КонецЕсли;
УстановитьПривилегированныйРежим(Истина);
Набор = РегистрыСведений.РеестрДокументов.СоздатьНаборЗаписей();
Набор.Отбор.Ссылка.Установить(Документ);
Набор.ЗагрузитьСОбработкой(ТаблицыДляДвижений.ТаблицаРеестрДокументов);
Набор.Записать();
УстановитьПривилегированныйРежим(Ложь);
КонецПроцедуры
(Для отражения независимых регистров сведений используется экспортная процедура "ЗаписатьДанные", в отличии от зависимых регистров, где используется "ОтразитьДвижения")
Теперь, когда мы подготовили новый учетный механизм, необходимо описать его принадлежность к документу ДвижениеДрагметаллов. Дополнительно добавим движение нового документа в РС "РеестрДокументов".
Модуль менеджера документа ДвижениеДрагметаллов
// Описывает учетные механизмы используемые в документе для регистрации в механизме проведения.
//
// Параметры:
// МеханизмыДокумента - Массив - список имен учетных механизмов, для которых будет выполнена
// регистрация в механизме проведения.
//
Процедура ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента) Экспорт
МеханизмыДокумента.Добавить("УчетДрагметаллов");
МеханизмыДокумента.Добавить("РеестрДокументов");
КонецПроцедуры
Также опишем получение данных для движений нового документа
Модуль менеджера документа ДвижениеДрагметаллов
// Возвращает таблицы для движений, необходимые для проведения документа по регистрам учетных механизмов.
//
// Параметры:
// Документ - ДокументСсылка - ссылка на документ, по которому необходимо получить данные
// Регистры - Структура - список имен регистров, для которых необходимо получить таблицы
// ДопПараметры - Структура - дополнительные параметры для получения данных, определяющие контекст проведения.
//
// Возвращаемое значение:
// Структура - коллекция элементов:
// * Таблица<ИмяРегистра> - ТаблицаЗначений - таблица данных для отражения в регистр.
//
Функция ДанныеДокументаДляПроведения(Документ, Регистры, ДопПараметры = Неопределено) Экспорт
Если ДопПараметры = Неопределено Тогда
ДопПараметры = ПроведениеДокументов.ДопПараметрыИнициализироватьДанныеДокументаДляПроведения();
КонецЕсли;
Запрос = Новый Запрос;
ТекстыЗапроса = Новый СписокЗначений;
Если Не ДопПараметры.ПолучитьТекстыЗапроса Тогда
////////////////////////////////////////////////////////////////////////////
// Создадим запрос инициализации движений
ЗаполнитьПараметрыИнициализации(Запрос, Документ);
////////////////////////////////////////////////////////////////////////////
// Сформируем текст запроса
ТекстЗапросаТаблицаОстаткиДрагметаллов(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаДрагметаллыВИзделиях(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаРеестрДокументов(Запрос, ТекстыЗапроса, Регистры);
КонецЕсли;
////////////////////////////////////////////////////////////////////////////
// Получим таблицы для движений
Возврат ПроведениеДокументов.ИнициализироватьДанныеДокументаДляПроведения(Запрос, ТекстыЗапроса, ДопПараметры);
КонецФункции
Процедура ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка)
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Запрос.Текст =
"ВЫБРАТЬ
| ДанныеДокумента.ПометкаУдаления КАК ПометкаУдаления,
| ДанныеДокумента.Проведен КАК Проведен,
| ДанныеДокумента.Дата КАК Период,
| ДанныеДокумента.Номер КАК Номер,
| ДанныеДокумента.Организация КАК Организация,
| ДанныеДокумента.Подразделение КАК Подразделение,
| ДанныеДокумента.Ответственный КАК Ответственный,
| ДанныеДокумента.Комментарий КАК Комментарий,
| ДанныеДокумента.ХозяйственнаяОперация КАК ХозяйственнаяОперация
|ИЗ
| Документы.ДвижениеДрагметаллов КАК ДанныеДокумента
|ГДЕ
| ДанныеДокумента.Ссылка = &Ссылка";
Реквизиты = Запрос.Выполнить().Выбрать();
Реквизиты.Следующий();
Запрос.УстановитьПараметр("ПометкаУдаления", Реквизиты.ПометкаУдаления);
Запрос.УстановитьПараметр("Проведен", Реквизиты.Проведен);
Запрос.УстановитьПараметр("Период", Реквизиты.Период);
Запрос.УстановитьПараметр("Номер", Реквизиты.Номер);
Запрос.УстановитьПараметр("Организация", Реквизиты.Организация);
Запрос.УстановитьПараметр("Подразделение", Реквизиты.Подразделение);
Запрос.УстановитьПараметр("Ответственный", Реквизиты.Ответственный);
Запрос.УстановитьПараметр("Комментарий", Реквизиты.Комментарий);
Запрос.УстановитьПараметр("ХозяйственнаяОперация", Реквизиты.ХозяйственнаяОперация);
Запрос.УстановитьПараметр(
"ИдентификаторМетаданных",
ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Тип("ДокументСсылка.ДвижениеДрагметаллов")));
КонецПроцедуры
Функция ТекстЗапросаТаблицаОстаткиДрагметаллов(Запрос, ТекстыЗапроса, Регистры)
ИмяРегистра = "ОстаткиДрагметаллов";
Если НЕ ПроведениеДокументов.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
Возврат "";
КонецЕсли;
ТекстЗапроса =
"ВЫБРАТЬ
| ТаблицаТовары.НомерСтроки КАК НомерСтроки,
| &Период КАК Период,
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Приход) КАК ВидДвижения,
| ТаблицаТовары.Номенклатура КАК Номенклатура,
| ТаблицаДрагметаллы.Драгметалл КАК Драгметалл,
| ТаблицаТовары.Количество КАК Количество,
| ТаблицаДрагметаллы.КоличествоВсего КАК КоличествоДрагметаллов
|ИЗ
| Документ.ДвижениеДрагметаллов.Товары КАК ТаблицаТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ДвижениеДрагметаллов.Драгметаллы КАК ТаблицаДрагметаллы
| ПО ТаблицаМатериалы.Ссылка = ТаблицаДрагметаллы.Ссылка
| И ТаблицаМатериалы.ИдентификаторСтроки = ТаблицаДрагметаллы.ИдентификаторСтроки
|ГДЕ
| ТаблицаМатериалы.Ссылка = &Ссылка
| И &ХозяйственнаяОперация В (ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ЗакупкаУПоставщика))
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ТаблицаМатериалы.НомерСтроки,
| &Период,
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход),
| ТаблицаТовары.Номенклатура КАК Номенклатура,
| ТаблицаДрагметаллы.Драгметалл КАК Драгметалл,
| ТаблицаТовары.Количество КАК Количество,
| ТаблицаДрагметаллы.КоличествоВсего КАК КоличествоДрагметаллов
|ИЗ
| Документ.ДвижениеДрагметаллов.Товары КАК ТаблицаТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ДвижениеДрагметаллов.Драгметаллы КАК ТаблицаДрагметаллы
| ПО ТаблицаМатериалы.Ссылка = ТаблицаДрагметаллы.Ссылка
| И ТаблицаМатериалы.ИдентификаторСтроки = ТаблицаДрагметаллы.ИдентификаторСтроки
|ГДЕ
| ТаблицаМатериалы.Ссылка = &Ссылка
| И &ХозяйственнаяОперация В (ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.РеализацияКлиенту))
|
|УПОРЯДОЧИТЬ ПО
| НомерСтроки";
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
Возврат ТекстЗапроса;
КонецФункции
Функция ТекстЗапросаТаблицаДрагметаллыВИзделиях(Запрос, ТекстыЗапроса, Регистры)
ИмяРегистра = "ДрагметаллыВИзделиях";
Если НЕ ПроведениеДокументов.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
Возврат "";
КонецЕсли;
ТекстЗапроса =
"ВЫБРАТЬ
| ТаблицаМатериалы.НомерСтроки КАК НомерСтроки,
| &Период КАК Период,
| ТаблицаТовары.Номенклатура КАК Номенклатура,
| ТаблицаДрагметаллы.Драгметалл КАК Драгметалл,
| ТаблицаТовары.Количество КАК Количество,
| ТаблицаДрагметаллы.КоличествоВсего КАК КоличествоДрагметаллов
|ИЗ
| Документ.ДвижениеДрагметаллов.Товары КАК ТаблицаТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ДвижениеДрагметаллов.Драгметаллы КАК ТаблицаДрагметаллы
| ПО ТаблицаМатериалы.Ссылка = ТаблицаДрагметаллы.Ссылка
| И ТаблицаМатериалы.ИдентификаторСтроки = ТаблицаДрагметаллы.ИдентификаторСтроки
|ГДЕ
| ТаблицаМатериалы.Ссылка = &Ссылка
|
|УПОРЯДОЧИТЬ ПО
| НомерСтроки";
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
Возврат ТекстЗапроса;
КонецФункции
Функция ТекстЗапросаТаблицаРеестрДокументов(Запрос, ТекстыЗапроса, Регистры)
ИмяРегистра = "РеестрДокументов";
Если НЕ ПроведениеДокументов.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
Возврат "";
КонецЕсли;
Если НЕ ПроведениеДокументов.ЕстьТаблицаЗапроса("ВтОснований", ТекстыЗапроса) Тогда
ТекстЗапросаВтОснований(Запрос, ТекстыЗапроса);
КонецЕсли;
ТекстЗапроса =
"ВЫБРАТЬ
| &ИдентификаторМетаданных КАК ТипСсылки,
| &Организация КАК Организация,
| НЕОПРЕДЕЛЕНО КАК ХозяйственнаяОперация,
| НЕОПРЕДЕЛЕНО КАК Партнер,
| НЕОПРЕДЕЛЕНО КАК Контрагент,
| НЕОПРЕДЕЛЕНО КАК Договор,
| НЕОПРЕДЕЛЕНО КАК НаправлениеДеятельности,
| НЕОПРЕДЕЛЕНО КАК ДополнительнаяЗапись,
| &Подразделение КАК Подразделение,
| НЕОПРЕДЕЛЕНО КАК МестоХранения,
| &Период КАК ДатаДокументаИБ,
| &Ссылка КАК Ссылка,
| НЕОПРЕДЕЛЕНО КАК РазделительЗаписи,
| &Номер КАК НомерДокументаИБ,
| НЕОПРЕДЕЛЕНО КАК Статус,
| &Ответственный КАК Ответственный,
| ВЫРАЗИТЬ("""" КАК СТРОКА (100)) КАК Дополнительно,
| ВЫРАЗИТЬ(&Комментарий КАК СТРОКА (100)) КАК Комментарий,
| &Проведен КАК Проведен,
| &ПометкаУдаления КАК ПометкаУдаления,
| НЕОПРЕДЕЛЕНО КАК ДатаПервичногоДокумента,
| НЕОПРЕДЕЛЕНО КАК НомерПервичногоДокумента,
| 0 КАК Сумма,
| НЕОПРЕДЕЛЕНО КАК Валюта,
| &Период КАК ДатаОтраженияВУчете
|ИЗ
| Документ.ДвижениеДрагметаллов КАК ТаблицаДокумента
|ГДЕ
| ТаблицаДокумента.Ссылка = &Ссылка";
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
Возврат ТекстЗапроса;
КонецФункции
И наконец перейдем к процедуре "ПровестиДокумент" общего модуля "ПроведениеДокументов", из которой происходит весь процесс проведения, и разберем его подробнее:
Процедура ПровестиДокумент(Документ, Отказ, ДопПараметры)
//++ Свойства мы определяли в модуле объекта документа в процедуре ПередЗаписью
Свойства = СвойстваДокумента(Документ);
МенеджерДокумента = Документы[Документ.Метаданные().Имя];
ПроведениеДокументовЛокализация.ПереназначитьМодульПолученияДанныхДокумента(МенеджерДокумента);
//++ Учетные механизмы документы определены в модуле менеджера в функции ЗарегистрироватьУчетныеМеханизмы
МеханизмыДокумента = УчетныеМеханизмыДокумента(МенеджерДокумента);
//++ В учетных механизмах конфигурации мы добавили новый механизм "УчетДрагметаллов"
МеханизмыКонфигурации = УчетныеМеханизмыКонфигурации();
//++ Получение полного списка регистров из всех учетных механизмов документа
РегистрыКРегистрации = Новый Массив;
ДвижимыеРегистры = Новый Структура;
Механизмы = Новый СписокЗначений;
Для каждого Механизм Из МеханизмыДокумента Цикл
МодульМеханизма = ОбщегоНазначения.ОбщийМодуль(МеханизмыКонфигурации[Механизм]);
ПараметрыМеханизма = МодульМеханизма.ПараметрыДляПроведенияДокумента(Документ, Свойства); // см. ПроведениеДокументов.ПараметрыУчетногоМеханизма
ПараметрыМеханизма.Вставить("МодульМеханизма", МодульМеханизма);
Если Свойства.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(РегистрыКРегистрации, ПараметрыМеханизма.ПодчиненныеРегистры);
Для каждого Регистр Из ПараметрыМеханизма.ПодчиненныеРегистры Цикл
ДвижимыеРегистры.Вставить(Регистр.Имя);
КонецЦикла;
Для каждого Регистр Из ПараметрыМеханизма.НезависимыеРегистры Цикл
ДвижимыеРегистры.Вставить(Регистр.Имя);
КонецЦикла;
КонецЕсли;
Механизмы.Добавить(ПараметрыМеханизма, Механизм);
КонецЦикла;
Механизмы.СортироватьПоПредставлению();
//++ Очистка "старых" движений и возведение флагов "Записывать" движений документа в Истина
ПодготовитьНаборыЗаписейКРегистрацииДвижений(Документ, Свойства, РегистрыКРегистрации);
Если Свойства.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
//++ Получение таблиц движений из модуля менеджера документа
ТаблицыДляДвижений = ТаблицыДляДвижений(Документ, МенеджерДокумента, ДвижимыеРегистры, ДопПараметры);
//++ Запись полученных таблиц в Движения документа
ОтразитьДвиженияПодчиненныхРегистров(Механизмы, Документ, ТаблицыДляДвижений, Отказ);
КонецЕсли;
//++ Добавление в ДополнительныеСвойства документа МВТ для контроля
МенеджерВременныхТаблиц = МенеджерВременныхТаблицКонтроля(Документ);
//++ Добавление служебных свойств наборам записей контрольных и отложенных регистров
УстановитьДопСвойстваКонтрольныхРегистров(Механизмы, Документ, МенеджерВременныхТаблиц);
//++ Обработка "Производных" механизмов до записи движений
ОбработатьДокументПередЗаписьюДвижений(Механизмы, Документ, МенеджерВременныхТаблиц, Отказ);
//++ Запись движений в базу данных
Документ.Движения.Записать();
//++ Обработка "Производных" механизмов после записи движений
ОбработатьДокументПослеЗаписиДвижений(Механизмы, Документ, МенеджерВременныхТаблиц, Отказ);
//++ Старт механизма контроля движений
ВыполнитьКонтрольРезультатовПроведения(Механизмы, Документ, МенеджерВременныхТаблиц, Отказ);
Если Свойства.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
//++ Запись независимых регистров сведений в базу данных
ЗаписатьДвиженияНезависимыхРегистров(Механизмы, Документ, ТаблицыДляДвижений, Отказ);
КонецЕсли;
Если Не Отказ Тогда
//++ Старт механизма отложенного движения
СформироватьЗаданияНаОтложенныеДвижения(Документ, МенеджерВременныхТаблиц);
КонецЕсли;
МенеджерВременныхТаблиц.Закрыть();
КонецПроцедуры
3. Необходимо сделать записи в существующие регистры, но имеющийся учетный механизм не подходит.
Необходимо сделать запись в независимый регистр сведений "ДокументыПоОС" из документа "ОтражениеЗарплатыВФинансовомУчете", если в качестве аналитики расходов указан Объект эксплуатации.
Нужный нам регистр отражен в учетном механизме "ОсновныеСредства":
Общий модуль ОсновныеСредстваСервер
// Формирует параметры для проведения документа по регистрам учетного механизма через общий механизм проведения.
//
// Параметры:
// Документ - ДокументОбъект - записываемый документ
// Свойства - ФиксированнаяСтруктура - свойства документа (См. ПроведениеДокументов.СвойстваДокумента).
//
// Возвращаемое значение:
// Структура - параметры учетного механизма (См. ПроведениеДокументов.ПараметрыУчетногоМеханизма()).
//
Функция ПараметрыДляПроведенияДокумента(Документ, Свойства) Экспорт
Параметры = ПроведениеДокументов.ПараметрыУчетногоМеханизма();
// Проведение
Если Свойства.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Параметры.ПодчиненныеРегистры.Добавить(Метаданные.РегистрыНакопления.АмортизацияОС);
Параметры.ПодчиненныеРегистры.Добавить(Метаданные.РегистрыНакопления.СтоимостьОС);
Параметры.ПодчиненныеРегистры.Добавить(Метаданные.РегистрыСведений.МестонахождениеОС);
Параметры.ПодчиненныеРегистры.Добавить(Метаданные.РегистрыСведений.ПараметрыАмортизацииОСУУ);
Параметры.ПодчиненныеРегистры.Добавить(Метаданные.РегистрыСведений.ПервоначальныеСведенияОС);
Параметры.ПодчиненныеРегистры.Добавить(Метаданные.РегистрыСведений.ПорядокУчетаОС);
Параметры.ПодчиненныеРегистры.Добавить(Метаданные.РегистрыСведений.ПорядокУчетаОСУУ);
КонецЕсли;
// Контроль
Если Свойства.РежимЗаписи <> РежимЗаписиДокумента.Запись Тогда
Параметры.КонтрольныеРегистрыЗаданий.Добавить(Метаданные.РегистрыНакопления.АмортизацияОС);
Параметры.КонтрольныеРегистрыЗаданий.Добавить(Метаданные.РегистрыНакопления.СтоимостьОС);
Параметры.КонтрольныеРегистрыЗаданий.Добавить(Метаданные.РегистрыСведений.МестонахождениеОС);
Параметры.КонтрольныеРегистрыЗаданий.Добавить(Метаданные.РегистрыСведений.ПараметрыАмортизацииОСУУ);
Параметры.КонтрольныеРегистрыЗаданий.Добавить(Метаданные.РегистрыСведений.ПервоначальныеСведенияОС);
Параметры.КонтрольныеРегистрыЗаданий.Добавить(Метаданные.РегистрыСведений.ПорядокУчетаОСУУ);
КонецЕсли;
Параметры.НезависимыеРегистры.Добавить(Метаданные.РегистрыСведений.ДокументыПоОС);
ОсновныеСредстваЛокализация.ДополнитьПараметрыДляПроведенияДокумента(Параметры, Документ, Свойства);
Возврат Параметры;
КонецФункции
Но помимо него, там указаны регистры, которые нам использовать не требуется. Поэтому добавим новый Учетный механизм, в котором опишем движение только по РС "ДокументыПоОС":
Общий модуль ПроведениеДокументов
// Описывает учетные механизмы используемые в конфигурации.
//
Функция УчетныеМеханизмыКонфигурации()
МеханизмыКонфигурации = Новый Структура;
... //Тут описаны типовые механизмы
//++ НАЧАЛО ДОРАБОТКИ -->
// Ключ - Имя механизма, Значение - модуль реализующий интерфейс проведения
МеханизмыКонфигурации.Вставить("ДокументыПоОС", "ДокументыПоОССервер");
//-- КОНЕЦ ДОРАБОТКИ <--
Возврат МеханизмыКонфигурации;
КонецФункции
Общий модуль ДокументыПоОССервер
// Формирует параметры для проведения документа по регистрам учетного механизма через общий механизм проведения.
//
// Параметры:
// Документ - ДокументОбъект - записываемый документ
// Свойства - ФиксированнаяСтруктура - свойства документа (См. ПроведениеДокументов.СвойстваДокумента).
//
// Возвращаемое значение:
// Структура - параметры учетного механизма (См. ПроведениеДокументов.ПараметрыУчетногоМеханизма()).
//
Функция ПараметрыДляПроведенияДокумента(Документ, Свойства) Экспорт
Параметры = ПроведениеДокументов.ПараметрыУчетногоМеханизма();
// Проведение
Если Свойства.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Параметры.НезависимыеРегистры.Добавить(Метаданные.РегистрыСведений.ДокументыПоОС);
КонецЕсли;
Возврат Параметры;
КонецФункции
// Процедура формирования движений по независимым регистрам основных средств.
//
// Параметры:
// ТаблицыДляДвижений - Структура - таблицы данных документа
// Документ - ДокументСсылка - ссылка на документ
// Отказ - Булево - признак отказа от проведения документа.
//
Процедура ЗаписатьДанные(ТаблицыДляДвижений, Документ, Отказ) Экспорт
Если Отказ Тогда
Возврат;
КонецЕсли;
Если ТаблицыДляДвижений.Свойство("ТаблицаДокументыПоОС") Тогда
Набор = РегистрыСведений.ДокументыПоОС.СоздатьНаборЗаписей();
Набор.Отбор.Ссылка.Установить(Документ);
Набор.Загрузить(ТаблицыДляДвижений.ТаблицаДокументыПоОС);
Набор.Записать();
КонецЕсли;
ОсновныеСредстваЛокализация.ЗаписатьДанные(ТаблицыДляДвижений, Документ, Отказ);
КонецПроцедуры
Осталось добавить новый механизм для документа "ОтражениеЗарплатыВФинансовомУчете" и описать получение таблицы движений
Модуль менеджера документа ОтражениеЗарплатыВФинансовомУчете
// Описывает учетные механизмы используемые в документе для регистрации в механизме проведения.
//
// Параметры:
// МеханизмыДокумента - Массив - список имен учетных механизмов, для которых будет выполнена
// регистрация в механизме проведения.
//
Процедура ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента) Экспорт
МеханизмыДокумента.Добавить("ИнтеграцияБЗК");
//++ НЕ УТКА
МеханизмыДокумента.Добавить("МеждународныйУчет");
//-- НЕ УТКА
МеханизмыДокумента.Добавить("ОборотныеРегистрыУправленческогоУчета");
МеханизмыДокумента.Добавить("ОтражениеЗарплатыВФинансовомУчете");
МеханизмыДокумента.Добавить("РасчетыСПодотчетниками");
МеханизмыДокумента.Добавить("РегламентированныйУчет");
МеханизмыДокумента.Добавить("УчетУСН");
МеханизмыДокумента.Добавить("СебестоимостьИПартионныйУчет");
МеханизмыДокумента.Добавить("УчетДоходовРасходов");
МеханизмыДокумента.Добавить("УчетНЗП");
МеханизмыДокумента.Добавить("УчетПрочихАктивовПассивов");
//++ НАЧАЛО ДОРАБОТКИ -->
МеханизмыДокумента.Добавить("ДокументыПоОС");
//-- КОНЕЦ ДОРАБОТКИ <--
КонецПроцедуры
// Возвращает таблицы для движений, необходимые для проведения документа по регистрам учетных механизмов.
//
// Параметры:
// Документ - ДокументСсылка - ссылка на документ, по которому необходимо получить данные
// Регистры - Структура - список имен регистров, для которых необходимо получить таблицы
// ДопПараметры - Структура - дополнительные параметры для получения данных, определяющие контекст проведения.
//
// Возвращаемое значение:
// Структура - коллекция элементов:
// * Таблица<ИмяРегистра> - ТаблицаЗначений - таблица данных для отражения в регистр.
//
Функция ДанныеДокументаДляПроведения(Документ, Регистры, ДопПараметры = Неопределено) Экспорт
Если ДопПараметры = Неопределено Тогда
ДопПараметры = ПроведениеДокументов.ДопПараметрыИнициализироватьДанныеДокументаДляПроведения();
КонецЕсли;
Запрос = Новый Запрос;
ТекстыЗапроса = Новый СписокЗначений;
Если Не ДопПараметры.ПолучитьТекстыЗапроса Тогда
////////////////////////////////////////////////////////////////////////////
// Создадим запрос инициализации движений
ЗаполнитьПараметрыИнициализации(Запрос, Документ);
////////////////////////////////////////////////////////////////////////////
// Сформируем текст запроса
ТекстЗапросаТаблицаТрудозатратыНезавершенногоПроизводства(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаОтражениеЗарплатыВФинансовомУчете(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаПрочиеРасходы(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаПартииПрочихРасходов(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаДвиженияДоходыРасходыПрочиеАктивыПассивы(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаДвиженияДенежныеСредстваДоходыРасходы(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаПрочиеАктивыПассивы(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаДенежныеСредстваУПодотчетныхЛиц(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаОценочныеОбязательстваПоСотрудникам(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаОтражениеДокументовВРеглУчете(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаПорядокОтраженияПрочихОпераций(Запрос, ТекстыЗапроса, Регистры);
ТекстЗапросаТаблицаКУДиР(Запрос, ТекстыЗапроса, Регистры);
ОтразитьПрочуюВыручку(Запрос, ТекстыЗапроса, Регистры);
//++ НАЧАЛО ДОРАБОТКИ -->
ТекстЗапросаТаблицаДокументыПоОС(Запрос, ТекстыЗапроса, Регистры);
//-- КОНЕЦ ДОРАБОТКИ <--
КонецЕсли;
////////////////////////////////////////////////////////////////////////////
// Получим таблицы для движений
Возврат ПроведениеДокументов.ИнициализироватьДанныеДокументаДляПроведения(Запрос, ТекстыЗапроса, ДопПараметры);
КонецФункции
Функция ТекстЗапросаТаблицаДокументыПоОС(Запрос, ТекстыЗапроса, Регистры)
ИмяРегистра = "ДокументыПоОС";
Если НЕ ПроведениеДокументов.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
Возврат "";
КонецЕсли;
ТекстЗапроса =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ЕСТЬNULL(ТаблицаОС.НомерСтроки - 1, 0) КАК НомерЗаписи,
| &Дата КАК Дата,
| &Ссылка КАК Ссылка,
| &Организация КАК Организация,
| ТаблицаОС.ПодразделениеПредприятия КАК Подразделение,
| &ИдентификаторМетаданных КАК ТипСсылки,
| ЗНАЧЕНИЕ(Перечисление.ХозяйственныеОперации.ОтражениеЗаработнойПлаты) КАК ХозяйственнаяОперация,
| ТаблицаОС.Ссылка.Проведен КАК Проведен,
| ИСТИНА КАК ОтражатьВРеглУчете,
| ИСТИНА КАК ОтражатьВУпрУчете,
| ТаблицаОС.СпособОтраженияЗарплатыВБухучете.АналитикаРасходов КАК ОсновноеСредство
|ИЗ
| Документ.ОтражениеЗарплатыВФинансовомУчете.НачисленнаяЗарплатаИВзносы КАК ТаблицаОС
|ГДЕ
| ТаблицаОС.Ссылка = &Ссылка
| И ТаблицаОС.СпособОтраженияЗарплатыВБухучете.АналитикаРасходов <> НЕОПРЕДЕЛЕНО
| И ТаблицаОС.СпособОтраженияЗарплатыВБухучете.АналитикаРасходов ССЫЛКА Справочник.ОбъектыЭксплуатации
| И ТаблицаОС.СпособОтраженияЗарплатыВБухучете.АналитикаРасходов <> ЗНАЧЕНИЕ(Справочник.ОбъектыЭксплуатации.ПустаяСсылка)";
ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
Запрос.УстановитьПараметр(
"ИдентификаторМетаданных",
ОбщегоНазначения.ИдентификаторОбъектаМетаданных(Тип("ДокументСсылка.ОтражениеЗарплатыВФинансовомУчете")));
Возврат ТекстЗапроса;
КонецФункции