Актуально для ERP 2.5.8.369 (БСП 3.1.6.425)
У документа в параметре «Удаление движений» устанавливаем «Не удалять автоматически». Удалением движений мы будем управлять самостоятельно.
В общем модуле ПроведениеДокументов.УчетныеМеханизмыКонфигурации() или ПроведениеДокументовЛокализация.ДополнитьУчетныеМеханизмыКонфигурации() добавить строку вида
МеханизмыКонфигурации.Вставить(«ФЕС_ИмяМеханизма», «ФЕС_ИмяМодуля»);
или
МеханизмыКонфигурации.Вставить(«ФинансовыйРезультат», «РегистрыНакопления.ФинансовыеРезультаты»);
где
первый параметр - имя механизма
второй параметр - общий модуль или менеджер, где располагается логика.
В случае, если вторым параметром указан общий модуль, его доступность:
В модуле менеджера нового документа, а так же в существующих документах, которые должны двигать регистры механизма ФЕС_ИмяМеханизма, определим или расширим процедуру, которая добавит наш документ к новому механизму.
// Описывает учетные механизмы используемые в документе для регистрации в механизме проведения.
//
// Параметры:
// МеханизмыДокумента - Массив - список имен учетных механизмов, для которых будет выполнена
// регистрация в механизме проведения.
//
Процедура ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента) Экспорт
МеханизмыДокумента.Добавить("ФЕС_ИмяМеханизма");
КонецПроцедуры
Добавить в модуль ФЕС_ИмяМодуля функцию ПараметрыДляПроведенияДокумента
Оформление областей: ПрограммныйИнтерфейс/Проведение
// Формирует параметры для проведения документа по регистрам учетного механизма через общий механизм проведения.
//
// Параметры:
// Документ - ДокументОбъект - записываемый документ
// Свойства - См. ПроведениеДокументов.СвойстваДокумента
//
// Возвращаемое значение:
// Структура - См. ПроведениеДокументов.ПараметрыУчетногоМеханизма
//
Функция ПараметрыДляПроведенияДокумента(Документ, Свойства) Экспорт
Параметры = ПроведениеДокументов.ПараметрыУчетногоМеханизма();
// Проведение
Если Свойства.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
Параметры.ПодчиненныеРегистры.Добавить(Метаданные.РегистрыСведений.ФЕС_Промоакции);
Параметры.ПодчиненныеРегистры.Добавить(Метаданные.РегистрыНакопления.ФЕС_ПромоакцииСогласованноеКоличество);
КонецЕсли;
// Контроль
Если Свойства.РежимЗаписи <> РежимЗаписиДокумента.Запись Тогда
//ТипДокумента = ТипЗнч(Документ);
//
//Если ТипДокумента = Тип("ДокументОбъект.ЗаказПоставщику") Тогда
//
// Параметры.КонтрольныеРегистрыИзменений.Добавить(Метаданные.РегистрыНакопления.ФЕС_ЗапросыНаЗакупку);
//
//КонецЕсли;
КонецЕсли;
Возврат Параметры;
КонецФункции
и процедуру ОтразитьДвижения
// Процедура формирования движений по подчиненным регистрам закупок. // // Параметры: // ТаблицыДляДвижений - Структура - таблицы данных документа // Движения - КоллекцияДвижений - коллекция наборов записей движений документа // Отказ - Булево - признак отказа от проведения документа. // Процедура ОтразитьДвижения(ТаблицыДляДвижений, Движения, Отказ) Экспорт Если Отказ Тогда Возврат; КонецЕсли; ПроведениеДокументов.ОтразитьДвижения(ТаблицыДляДвижений, Движения, "ФЕС_Промоакции"); ПроведениеДокументов.ОтразитьДвижения(ТаблицыДляДвижений, Движения, "ФЕС_ПромоакцииСогласованноеКоличество"); КонецПроцедуры
Добавление регистра в параметры КонтрольныеРегистрыИзменений указывает, что по регистру проводится контроль.
Необходимо добавить процедуру ИнициализироватьДанныеКонтроляИзменений(), где текстом запроса из предварительно созданной временной таблицы и таблицы остатков по регистру выбираем данные.
Ошибки фиксируются и выводятся в процедуре «СообщитьОРезультатахКонтроляИзменений»
Если контроль не нужен, просто поставить заглушки
// Формирует тексты запросов для контроля изменений записанных движений регистров. // // Параметры: // Запрос - Запрос - запрос, хранящий параметры используемые в списке запросов // ТекстыЗапроса - СписокЗначений - список текстов запросов и их имен. // Документ - ДокументОбъект - записываемый документ. // Процедура ИнициализироватьДанныеКонтроляИзменений(Запрос, ТекстыЗапроса, Документ) Экспорт КонецПроцедуры
// Выводит сообщения пользователю при наличии ошибок контроля изменений записанных движений регистров. // // Параметры: // РезультатыКонтроля - Структура - таблицы с результатами контроля изменений // Документ - ДокументОбъект - записываемый документ // Отказ - Булево - признак отказа от проведения документа. // Процедура СообщитьОРезультатахКонтроляИзменений(РезультатыКонтроля, Документ, Отказ) Экспорт КонецПроцедуры
и заглушку для контроля даты запрета
// Дополняет текст запроса механизма проверки даты запрета по таблице изменений. // // Параметры: // Запрос - Запрос - используется для установки параметров запроса. // // Возвращаемое значение: // Соответствие - соответствие имен таблиц изменения регистров и текстов запросов. // Функция ТекстыЗапросовКонтрольДатыЗапретаПоТаблицеИзменений(Запрос) Экспорт СоответствиеТекстовЗапросов = Новый Соответствие(); Возврат СоответствиеТекстовЗапросов; КонецФункции
Событие «Перед записью»
ПроведениеДокументов.ПередЗаписьюДокумента(ЭтотОбъект, РежимЗаписи, РежимПроведения);
Событие «Обработка проведения»
ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);
Событие «Обработка удаления проведения»
ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);
Событие «При записи»
ПроведениеДокументов.ПриЗаписиДокумента(ЭтотОбъект, Отказ);
При проведении документа вызов ПроведениеДокументов.ОбработкаПроведенияДокумента идет в модуль менеджера документа, где вызывается процедура ДанныеДокументаДляПроведения(), в которой инициализируются параметры запроса и тексты запросов для движений.
// Возвращает таблицы для движений, необходимые для проведения документа по регистрам учетных механизмов. // // Параметры: // Документ - ДокументСсылка - ссылка на документ, по которому необходимо получить данные // Регистры - Структура - список имен регистров, для которых необходимо получить таблицы // ДопПараметры - Структура - дополнительные параметры для получения данных, определяющие контекст проведения. // // Возвращаемое значение: // Структура - коллекция элементов: // * Таблица<ИмяРегистра> - ТаблицаЗначений - таблица данных для отражения в регистр. // Функция ДанныеДокументаДляПроведения(Документ, Регистры, ДопПараметры = Неопределено) Экспорт // Комментарий: Подключаем документ к подсистеме Проведение документов. Если ДопПараметры = Неопределено Тогда ДопПараметры = ПроведениеДокументов.ДопПараметрыИнициализироватьДанныеДокументаДляПроведения(); КонецЕсли; Запрос = Новый Запрос; ТекстыЗапроса = Новый СписокЗначений; Если Не ДопПараметры.ПолучитьТекстыЗапроса Тогда //////////////////////////////////////////////////////////////////////////// // Создадим запрос инициализации движений ЗаполнитьПараметрыИнициализации(Запрос, Документ); //////////////////////////////////////////////////////////////////////////// // Сформируем текст запроса ТекстЗапросаТаблицаФЕС_Промоакции(Запрос, ТекстыЗапроса, Регистры); ТекстЗапросаТаблицаФЕС_ПромоакцииСогласованноеКоличество(Запрос, ТекстыЗапроса, Регистры); КонецЕсли; //////////////////////////////////////////////////////////////////////////// // Получим таблицы для движений Возврат ПроведениеДокументов.ИнициализироватьДанныеДокументаДляПроведения(Запрос, ТекстыЗапроса, ДопПараметры); КонецФункции
Параметры инициализации для таблиц проведения
Процедура ЗаполнитьПараметрыИнициализации(Запрос, ДокументСсылка)
Если Запрос = Неопределено Тогда
Запрос = Новый Запрос;
КонецЕсли;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр("Ссылка", ДокументСсылка);
Запрос.Текст =
"ВЫБРАТЬ
| ТаблицаДокумента.Номер КАК Номер,
| ТаблицаДокумента.Дата КАК Период,
| ТаблицаДокумента.ТорговаяСеть КАК ТорговаяСеть,
| ТаблицаДокумента.Организация КАК Организация,
| ТаблицаДокумента.Автор КАК Автор,
| ТаблицаДокумента.ВидСкидки КАК ВидСкидки,
| ТаблицаДокумента.ДатаНачалаОтгрузки КАК ДатаНачала,
| ТаблицаДокумента.ДатаОкончанияОтгрузки КАК ДатаОкончания
|ИЗ
| Документ.ФЕС_Промоакция КАК ТаблицаДокумента
|ГДЕ
| ТаблицаДокумента.Ссылка = &Ссылка";
РезультатЗапроса = Запрос.Выполнить();
Реквизиты = РезультатЗапроса.Выбрать();
Реквизиты.Следующий();
Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл
Запрос.УстановитьПараметр(Колонка.Имя, Реквизиты[Колонка.Имя]);
КонецЦикла;
// Фиксированные параметры запроса.
Запрос.УстановитьПараметр("ИдентификаторМетаданных", ОбщегоНазначения.ИдентификаторОбъектаМетаданных(ТипЗнч(ДокументСсылка)));
КонецПроцедуры
И добавить процедуры, формирующие таблицы движений
Функция ТекстЗапросаТаблицаФЕС_Промоакции(Запрос, ТекстыЗапроса, Регистры) ИмяРегистра = "ФЕС_Промоакции"; Если НЕ ПроведениеДокументов.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда Возврат ""; КонецЕсли; ТекстЗапроса = "ВЫБРАТЬ | &Ссылка КАК Регистратор, | &Организация КАК Организация, | &ТорговаяСеть КАК ТорговаяСеть, | ФЕС_ПромоакцияСубъектыПромоакции.Контрагент КАК Контрагент, | ФЕС_ПромоакцияСубъектыПромоакции.Партнер КАК Партнер, | ФЕС_ПромоакцияСпецификацияПромоакции.Номенклатура КАК Номенклатура, | &Ссылка КАК Промоакция, | &ДатаНачала КАК ДатаНачала, | КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ) КАК ДатаОкончания, | ФЕС_ПромоакцияСпецификацияПромоакции.ПроцентСкидки КАК ПроцентСкидки, | &ВидСкидки КАК ВидСкидки |ИЗ | Документ.ФЕС_Промоакция.СпецификацияПромоакции КАК ФЕС_ПромоакцияСпецификацияПромоакции | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ФЕС_Промоакция.СубъектыПромоакции КАК ФЕС_ПромоакцияСубъектыПромоакции | ПО ФЕС_ПромоакцияСпецификацияПромоакции.Ссылка = ФЕС_ПромоакцияСубъектыПромоакции.Ссылка |ГДЕ | ФЕС_ПромоакцияСпецификацияПромоакции.Ссылка = &Ссылка"; ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра); Возврат ТекстЗапроса; КонецФункции
Ну обновление вспомогательных данных не помешает после всего.
PS Внимательнее, если копипастим тексты процедур из статьи :) Не пропускаем ненужного.