Инструменты пользователя

Инструменты сайта


dev1c:doc_execution

Настройка проведения документа

Актуально для ERP 2.5.8.369 (БСП 3.1.6.425)

Настройка документа

У документа в параметре «Удаление движений» устанавливаем «Не удалять автоматически». Удалением движений мы будем управлять самостоятельно.

Описать механизм конфигурации

В общем модуле ПроведениеДокументов.УчетныеМеханизмыКонфигурации() или ПроведениеДокументовЛокализация.ДополнитьУчетныеМеханизмыКонфигурации() добавить строку вида
МеханизмыКонфигурации.Вставить(«ФЕС_ИмяМеханизма», «ФЕС_ИмяМодуля»);
или
МеханизмыКонфигурации.Вставить(«ФинансовыйРезультат», «РегистрыНакопления.ФинансовыеРезультаты»);
где
первый параметр - имя механизма
второй параметр - общий модуль или менеджер, где располагается логика.
В случае, если вторым параметром указан общий модуль, его доступность:

  • сервер,
  • внешнее соединение,
  • клиент (обычное приложение).

Регистрация механизма в документе

В модуле менеджера нового документа, а так же в существующих документах, которые должны двигать регистры механизма ФЕС_ИмяМеханизма, определим или расширим процедуру, которая добавит наш документ к новому механизму.

ДокументМенеджер.ИмяДокумента
// Описывает учетные механизмы используемые в документе для регистрации в механизме проведения.
//
// Параметры:
//  МеханизмыДокумента - Массив - список имен учетных механизмов, для которых будет выполнена
//              регистрация в механизме проведения.
//
Процедура ЗарегистрироватьУчетныеМеханизмы(МеханизмыДокумента) Экспорт
	
	МеханизмыДокумента.Добавить("ФЕС_ИмяМеханизма");
	
КонецПроцедуры

Описание параметров для проведения документа

Добавить в модуль ФЕС_ИмяМодуля функцию ПараметрыДляПроведенияДокумента
Оформление областей: ПрограммныйИнтерфейс/Проведение

ФЕС_ИмяМодуля.ПараметрыДляПроведенияДокумента
// Формирует параметры для проведения документа по регистрам учетного механизма через общий механизм проведения.
//
// Параметры:
//  Документ - ДокументОбъект - записываемый документ
//  Свойства - См. ПроведениеДокументов.СвойстваДокумента
//
// Возвращаемое значение:
//  Структура - См. ПроведениеДокументов.ПараметрыУчетногоМеханизма
//
Функция ПараметрыДляПроведенияДокумента(Документ, Свойства) Экспорт
	
	Параметры = ПроведениеДокументов.ПараметрыУчетногоМеханизма();
	
	// Проведение
	Если Свойства.РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
		
		Параметры.ПодчиненныеРегистры.Добавить(Метаданные.РегистрыСведений.ФЕС_Промоакции);
		Параметры.ПодчиненныеРегистры.Добавить(Метаданные.РегистрыНакопления.ФЕС_ПромоакцииСогласованноеКоличество);
		
	КонецЕсли;
	
	// Контроль
	Если Свойства.РежимЗаписи <> РежимЗаписиДокумента.Запись Тогда
				
		//ТипДокумента = ТипЗнч(Документ);
		//
		//Если ТипДокумента = Тип("ДокументОбъект.ЗаказПоставщику") Тогда
		//	
		//	Параметры.КонтрольныеРегистрыИзменений.Добавить(Метаданные.РегистрыНакопления.ФЕС_ЗапросыНаЗакупку);
		//	
		//КонецЕсли;
		
	КонецЕсли;
	
	Возврат Параметры;
	
КонецФункции

и процедуру ОтразитьДвижения

ФЕС_ИмяМодуля.ОтразитьДвижения
// Процедура формирования движений по подчиненным регистрам закупок.
//
// Параметры:
//	ТаблицыДляДвижений - Структура - таблицы данных документа
//	Движения - КоллекцияДвижений - коллекция наборов записей движений документа
//	Отказ - Булево - признак отказа от проведения документа.
//
Процедура ОтразитьДвижения(ТаблицыДляДвижений, Движения, Отказ) Экспорт
	Если Отказ Тогда
		Возврат;
	КонецЕсли;
	
	ПроведениеДокументов.ОтразитьДвижения(ТаблицыДляДвижений, Движения, "ФЕС_Промоакции");
	ПроведениеДокументов.ОтразитьДвижения(ТаблицыДляДвижений, Движения, "ФЕС_ПромоакцииСогласованноеКоличество");
	
КонецПроцедуры

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

Контроль изменений

Необходимо добавить процедуру ИнициализироватьДанныеКонтроляИзменений(), где текстом запроса из предварительно созданной временной таблицы и таблицы остатков по регистру выбираем данные.

Ошибки фиксируются и выводятся в процедуре «СообщитьОРезультатахКонтроляИзменений»

Если контроль не нужен, просто поставить заглушки

ФЕС_ИмяМодуля.ИнициализироватьДанныеКонтроляИзменений
// Формирует тексты запросов для контроля изменений записанных движений регистров.
//
// Параметры:
//  Запрос - Запрос - запрос, хранящий параметры используемые в списке запросов
//  ТекстыЗапроса - СписокЗначений - список текстов запросов и их имен.
//  Документ - ДокументОбъект - записываемый документ.
//
Процедура ИнициализироватьДанныеКонтроляИзменений(Запрос, ТекстыЗапроса, Документ) Экспорт
	
КонецПроцедуры
ФЕС_ИмяМодуля.СообщитьОРезультатахКонтроляИзменений
// Выводит сообщения пользователю при наличии ошибок контроля изменений записанных движений регистров.
//
// Параметры:
//  РезультатыКонтроля - Структура - таблицы с результатами контроля изменений
//  Документ - ДокументОбъект - записываемый документ
//  Отказ - Булево - признак отказа от проведения документа.
//
Процедура СообщитьОРезультатахКонтроляИзменений(РезультатыКонтроля, Документ, Отказ) Экспорт
	
КонецПроцедуры

и заглушку для контроля даты запрета

ФЕС_ИмяМодуля.ТекстыЗапросовКонтрольДатыЗапретаПоТаблицеИзменений
// Дополняет текст запроса механизма проверки даты запрета по таблице изменений.
// 
// Параметры:
// 	Запрос - Запрос - используется для установки параметров запроса.
// 
// Возвращаемое значение:
//	Соответствие - соответствие имен таблиц изменения регистров и текстов запросов.
//	
Функция ТекстыЗапросовКонтрольДатыЗапретаПоТаблицеИзменений(Запрос) Экспорт

	СоответствиеТекстовЗапросов = Новый Соответствие();
	Возврат СоответствиеТекстовЗапросов;
	
КонецФункции

Вызовы подсистемы проведения документов при событиях документа

Событие «Перед записью»
ПроведениеДокументов.ПередЗаписьюДокумента(ЭтотОбъект, РежимЗаписи, РежимПроведения);

Событие «Обработка проведения»
ПроведениеДокументов.ОбработкаПроведенияДокумента(ЭтотОбъект, Отказ);

Событие «Обработка удаления проведения»
ПроведениеДокументов.ОбработкаУдаленияПроведенияДокумента(ЭтотОбъект, Отказ);

Событие «При записи»
ПроведениеДокументов.ПриЗаписиДокумента(ЭтотОбъект, Отказ);

Добавление процедур и функций в менеджер документа

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

ДокументМенеджер.ИмяДокумента
// Возвращает таблицы для движений, необходимые для проведения документа по регистрам учетных механизмов.
//
// Параметры:
//  Документ - ДокументСсылка - ссылка на документ, по которому необходимо получить данные
//  Регистры - Структура - список имен регистров, для которых необходимо получить таблицы
//  ДопПараметры - Структура - дополнительные параметры для получения данных, определяющие контекст проведения.
//
// Возвращаемое значение:
//  Структура - коллекция элементов:
//     * Таблица<ИмяРегистра> - ТаблицаЗначений - таблица данных для отражения в регистр.
//
Функция ДанныеДокументаДляПроведения(Документ, Регистры, ДопПараметры = Неопределено) Экспорт
	// Комментарий: Подключаем документ к подсистеме Проведение документов.
	
	Если ДопПараметры = Неопределено Тогда
		ДопПараметры = ПроведениеДокументов.ДопПараметрыИнициализироватьДанныеДокументаДляПроведения();
	КонецЕсли;
	
	Запрос			= Новый Запрос;
	ТекстыЗапроса	= Новый СписокЗначений;
	
	Если Не ДопПараметры.ПолучитьТекстыЗапроса Тогда
		////////////////////////////////////////////////////////////////////////////
		// Создадим запрос инициализации движений
		
		ЗаполнитьПараметрыИнициализации(Запрос, Документ);
		
		////////////////////////////////////////////////////////////////////////////
		// Сформируем текст запроса
		
		ТекстЗапросаТаблицаФЕС_Промоакции(Запрос, ТекстыЗапроса, Регистры);
		ТекстЗапросаТаблицаФЕС_ПромоакцииСогласованноеКоличество(Запрос, ТекстыЗапроса, Регистры);
	КонецЕсли;
		
	////////////////////////////////////////////////////////////////////////////
	// Получим таблицы для движений
	
	Возврат ПроведениеДокументов.ИнициализироватьДанныеДокументаДляПроведения(Запрос, ТекстыЗапроса, ДопПараметры);
	
КонецФункции

Параметры инициализации для таблиц проведения

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

И добавить процедуры, формирующие таблицы движений

ДокументМенеджер.ИмяДокумента
Функция ТекстЗапросаТаблицаФЕС_Промоакции(Запрос, ТекстыЗапроса, Регистры)
	ИмяРегистра = "ФЕС_Промоакции";
	
	Если НЕ ПроведениеДокументов.ТребуетсяТаблицаДляДвижений(ИмяРегистра, Регистры) Тогда
		Возврат "";
	КонецЕсли;

	ТекстЗапроса = 
	"ВЫБРАТЬ
	|	&Ссылка КАК Регистратор,
	|	&Организация КАК Организация,
	|	&ТорговаяСеть КАК ТорговаяСеть,
	|	ФЕС_ПромоакцияСубъектыПромоакции.Контрагент КАК Контрагент,
	|	ФЕС_ПромоакцияСубъектыПромоакции.Партнер КАК Партнер,
	|	ФЕС_ПромоакцияСпецификацияПромоакции.Номенклатура КАК Номенклатура,
	|	&Ссылка КАК Промоакция,
	|	&ДатаНачала КАК ДатаНачала,
	|	КОНЕЦПЕРИОДА(&ДатаОкончания, ДЕНЬ) КАК ДатаОкончания,
	|	ФЕС_ПромоакцияСпецификацияПромоакции.ПроцентСкидки КАК ПроцентСкидки,
	|	&ВидСкидки КАК ВидСкидки
	|ИЗ
	|	Документ.ФЕС_Промоакция.СпецификацияПромоакции КАК ФЕС_ПромоакцияСпецификацияПромоакции
	|		ЛЕВОЕ СОЕДИНЕНИЕ Документ.ФЕС_Промоакция.СубъектыПромоакции КАК ФЕС_ПромоакцияСубъектыПромоакции
	|		ПО ФЕС_ПромоакцияСпецификацияПромоакции.Ссылка = ФЕС_ПромоакцияСубъектыПромоакции.Ссылка
	|ГДЕ
	|	ФЕС_ПромоакцияСпецификацияПромоакции.Ссылка = &Ссылка";
	
	ТекстыЗапроса.Добавить(ТекстЗапроса, ИмяРегистра);
	
	Возврат ТекстЗапроса;
КонецФункции

Ну обновление вспомогательных данных не помешает после всего.

PS Внимательнее, если копипастим тексты процедур из статьи :) Не пропускаем ненужного.

dev1c/doc_execution.txt · Последнее изменение: 2023/06/26 10:42 — admin16

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki