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