При работе с конфигурациями 1С, особенно такими как «Управление торговлей 10.3», часто возникает необходимость в разработке собственных документов для автоматизации уникальных бизнес-процессов. Однако, интеграция таких самописных решений в типовые механизмы, например, в автоматическое восстановление последовательности партионного учета, может быть сопряжена с определенными сложностями. В этой статье мы подробно разберем ситуацию, когда самописный документ не перепроводится при автоматическом восстановлении последовательности, выясним причины такого поведения и предложим пути решения.
Рассмотрим конкретный сценарий: разработчик создал в 1С:УТ 10.3 самописный документ под названием «Затраты на хранение». Этот документ предназначен для ежедневного начисления себестоимости на остатки регистра «Партии товаров на складах», при этом он не изменяет количество товаров. В системе настроено автоматическое восстановление последовательности, выполняемое по регламенту с помощью функции ЗаполнениеДокументов.ВыполнитьВосстановление. Однако при выполнении этой процедуры документ «Затраты на хранение» упорно отказывается перепроводиться.
ЗаполнениеДокументов.ВыполнитьВосстановление (ТекущаяДата(),
Справочники.Организации.ПустаяСсылка(),
Истина,
Истина,
Истина,
Ложь,
100,
100);
Давайте выясним, почему так происходит, и как мы можем интегрировать наш самописный документ в механизм восстановления последовательности.
Первоначально, изучая код механизма восстановления последовательности, мы обнаруживаем, что он активно взаимодействует с регистром сведений «Списанные товары». Наш самописный документ не формирует движений по этому регистру, что, по всей видимости, является причиной проблемы.
Что такое регистр сведений «Списанные товары» и зачем он нужен?
Регистр сведений «Списанные товары» в 1С:УТ 10.3 является ключевым служебным регистром. Его основная роль заключается в обеспечении корректного расчета себестоимости и поддержании механизма партионного учета. Он позволяет системе эффективно восстанавливать последовательность документов, затрагивающих партионный учет, без необходимости полного перепроведения всех документов с начала времен.
Функция этого регистра – обобщать информацию о расходе номенклатуры. Он действует как своего рода «интерфейс вызова» для механизма списания партий, делая алгоритмы списания независимыми от специфической структуры каждого первичного документа. Это крайне важно в условиях, когда суммы в движениях зависят от рассчитанной себестоимости списываемых товаров.
Партионный учет в УТ 10.3 и аналогичных конфигурациях строится на базе регистра оперативного учета «Себестоимость товаров». Регистр «Списанные товары» помогает формировать движения не только в этом регистре, но и в других регистрах партионного учета, таких как «Партии товаров на складах».
Как регистр «Списанные товары» связан с регистром «Партии товаров на складах»?
Регистр накопления «Партии товаров на складах» (или «Товары на складах» в некоторых версиях) хранит информацию об остатках товаров в разрезе партий и их себестоимости. Движения по этому регистру (приход и расход) формируются всеми документами, которые влияют на товародвижение.
Регистр сведений «Списанные товары», в свою очередь, содержит детализированную информацию о том, какие товары, в каком количестве и по какой себестоимости были списаны. Эта информация критически важна для двух основных процессов:
Таким образом, если наш самописный документ «Затраты на хранение» изменяет себестоимость в регистре «Партии товаров на складах», но не формирует соответствующих движений в «Списанные товары», система при восстановлении последовательности не видит, что этот документ участвует в процессах списания или влияет на них. Для нее он просто не является «списывающим» или «учитывающим себестоимость» документом в контексте партионного учета, и поэтому не перепроводится.
ДвижениеПартийТоваровВ процессе восстановления последовательности, после того как система определяет, какие документы должны быть перепроведены, она обращается к общему модулю УправлениеЗапасамиПартионныйУчет и вызывает функцию ДвижениеПартийТоваров, передавая в нее ссылку на документ. Рассмотрим фрагмент кода, который показывает, как эта функция получает данные для движений:
// Движение партий товаров по документу
УправлениеЗапасамиПартионныйУчет.ДвижениеПартийТоваров (ДокументСсылка,
,
КоличествоСтрокВДокументе,
Упр,
Бух,
Нал,
Останавливаться,
ПроведениеОстановлено,
ДокументМоментВремени,
Истина,
СтруктураНаборовЗаписей);
Внутри этой процедуры вызывается функция ПолучитьТаблицуСтрокДокументов, которая ищет движения в регистре сведений «Списанные товары». Если наш документ не создал записей в этом регистре, эта функция вернет пустую таблицу значений, что приведет к тому, что никаких движений по партионному учету для нашего документа сформировано не будет, и он фактически не будет перепроведен.
Функция ПолучитьТаблицуСтрокДокументов(ДокументСписания=Неопределено, Упр = Истина, Бух = Истина, Нал = Истина) Экспорт
// Общая часть запроса
Запрос = Новый Запрос;
Запрос.УстановитьПараметр("ДокументСписания", ДокументСписания);
Запрос.УстановитьПараметр("ВозвратОтКомиссионера", Перечисления.КодыОперацийПартииТоваров.ВозвратОтКомиссионера);
Запрос.УстановитьПараметр("РеализацияКомиссия", Перечисления.КодыОперацийПартииТоваров.РеализацияКомиссия);
Запрос.УстановитьПараметр("Упр", Упр);
Запрос.УстановитьПараметр("Бух", Бух);
Запрос.УстановитьПараметр("Нал", Нал);
Запрос.Текст =
"ВЫБРАТЬ
| ""ПолучитьТаблицуСтрокДокументов"" КАК QuieryId ";
Ресурсы = Метаданные.РегистрыСведений.СписанныеТовары.Ресурсы;
Для каждого Ресурс Из Ресурсы Цикл
Запрос.Текст = Запрос.Текст + ",
| "+ Ресурс.Имя;
КонецЦикла;
Запрос.Текст = Запрос.Текст + ",
| Регистратор,
| Период,
| НомерСтроки,
| НомерСтрокиДокумента,
| Номенклатура.ВестиПартионныйУчетПоСериям КАК ВестиПартионныйУчетПоСериям,
| ВЫБОР
| КОГДА
| КодОперацииПартииТоваров = &ВозвратОтКомиссионера
| ИЛИ КодОперацииПартииТоваров = &РеализацияКомиссия
| ТОГДА ""Переданные""
| ИНАЧЕ
| ""НаСкладах""
| КОНЕЦ КАК ИсточникПоКодуОперации
|ИЗ
| РегистрСведений.СписанныеТовары КАК Строки";
Если ДокументСписания <> Неопределено Тогда
Запрос.Текст = Запрос.Текст+ "
|ГДЕ
| Строки.Регистратор = &ДокументСписания";
КонецЕсли;
Запрос.Текст = СтрЗаменить(Запрос.Текст, "ОтражатьВУправленческомУчете", "(ОтражатьВУправленческомУчете И &Упр) КАК ОтражатьВУправленческомУчете");
Запрос.Текст = СтрЗаменить(Запрос.Текст, "ОтражатьВБухгалтерскомУчете", "(ОтражатьВБухгалтерскомУчете И &Бух) КАК ОтражатьВБухгалтерскомУчете");
Запрос.Текст = СтрЗаменить(Запрос.Текст, "ОтражатьВНалоговомУчете", "(ОтражатьВНалоговомУчете И &Нал) КАК ОтражатьВНалоговомУчете");
Результат = Запрос.Выполнить();
Возврат Результат.Выгрузить();
КонецФункции //ПолучитьТаблицуСтрокДокументов
Как мы видим из приведенного выше кода, функция ПолучитьТаблицуСтрокДокументов напрямую обращается к регистру сведений СписанныеТовары, фильтруя записи по текущему документу-регистратору. Если в этом регистре нет записей, связанных с нашим документом, то функция вернет пустую таблицу, и дальнейшие расчеты себестоимости и формирование движений по партийному учету не состоятся.
Для того чтобы наш самописный документ «Затраты на хранение» корректно перепроводился при автоматическом восстановлении последовательности в 1С:УТ 10.3, нам необходимо обеспечить формирование им движений в регистре сведений «Списанные товары». Рассмотрим несколько подходов к решению этой задачи.
Самый прямой и надежный способ – это внесение изменений непосредственно в модуль проведения документа «Затраты на хранение». Мы должны добавить код, который будет создавать необходимые записи в регистре «Списанные товары».
Порядок действий:
Номенклатура, ХарактеристикаНоменклатуры, СерияНоменклатуры, Склад, Организация), ресурсы (Количество, СтоимостьУпр, СтоимостьБух, СтоимостьНал) и, что важно, поле Регистратор. Также могут присутствовать флаги учета (ОтражатьВУправленческомУчете, ОтражатьВБухгалтерскомУчете, ОтражатьВНалоговомУчете) и КодОперацииПартииТоваров.Регистратор: Ссылка на текущий документ «Затраты на хранение».Период: Дата документа.Номенклатура, Склад, Организация: Данные, по которым распределяются затраты.Количество: В нашем случае это может быть 0, так как документ не списывает количество, а только влияет на себестоимость.СтоимостьУпр, СтоимостьБух, СтоимостьНал: Суммы затрат, которые мы хотим «накрутить» на себестоимость. Эти суммы будут использоваться при перепроведении.ОтражатьВУправленческомУчете, ОтражатьВБухгалтерскомУчете, ОтражатьВНалоговомУчете: Устанавливаем в зависимости от того, в каком виде учета мы хотим отразить затраты.КодОперацииПартииТоваров: Можно использовать, например, Перечисления.КодыОперацийПартииТоваров.ПрочиеЗатраты или Перечисления.КодыОперацийПартииТоваров.Списание, если такой есть или его можно добавить. Это поможет типизировать характер движений.Записать(Истина) для набора записей регистра сведений, чтобы движения были сохранены в базе данных.Пример кода для модуля проведения (псевдокод, требует адаптации под вашу структуру):
// ... (ваш основной код проведения документа) ...
// Создаем движения по регистру сведений "СписанныеТовары"
Движения.СписанныеТовары.Записывать = Истина;
Для Каждого СтрокаТабличнойЧасти Из ТабличнаяЧастьСЗатратами Цикл
НовоеДвижение = Движения.СписанныеТовары.Добавить();
НовоеДвижение.Регистратор = Ссылка;
НовоеДвижение.Период = Дата;
НовоеДвижение.Организация = СтрокаТабличнойЧасти.Организация;
НовоеДвижение.Номенклатура = СтрокаТабличнойЧасти.Номенклатура;
НовоеДвижение.Склад = СтрокаТабличнойЧасти.Склад;
НовоеДвижение.Количество = 0; // Или другое значение, если необходимо
НовоеДвижение.СтоимостьУпр = СтрокаТабличнойЧасти.СуммаЗатрат; // Ваша логика расчета суммы
НовоеДвижение.СтоимостьБух = СтрокаТабличнойЧасти.СуммаЗатрат;
НовоеДвижение.СтоимостьНал = СтрокаТабличнойЧасти.СуммаЗатрат;
НовоеДвижение.ОтражатьВУправленческомУчете = Истина;
НовоеДвижение.ОтражатьВБухгалтерскомУчете = Истина;
НовоеДвижение.ОтражатьВНалоговомУчете = Истина;
// Возможно, потребуется установка КодОперацииПартииТоваров
// НовоеДвижение.КодОперацииПартииТоваров = Перечисления.КодыОперацийПартииТоваров.ПрочиеЗатраты;
КонецЦикла;
// Движения автоматически запишутся при Записать(РежимПроведения)
Этот подход гарантирует, что при каждом проведении нашего документа будут формироваться необходимые записи, которые затем будут обнаружены функцией ПолучитьТаблицуСтрокДокументов во время восстановления последовательности.
Прежде чем приступать к глубокой доработке, всегда полезно рассмотреть, как подобные задачи решаются в типовой конфигурации. Возможно, функциональность, которую мы пытаемся реализовать самописным документом, уже есть в УТ 10.3 или может быть реализована с меньшими доработками.
Если прямое изменение модуля документа по каким-либо причинам нежелательно, можно рассмотреть создание внешней обработки или подписки на событие ПриЗаписи или ПриПроведении документа. Эти механизмы позволят нам формировать движения в регистре «Списанные товары» после проведения документа.
Однако, этот подход является менее надежным для восстановления последовательности, так как требует обеспечения строгой хронологической очередности выполнения. При восстановлении последовательности система ожидает, что все движения, необходимые для ее расчетов, уже сформированы самим документом во время его проведения. Внешние механизмы могут работать с задержкой или быть отключены, что приведет к тем же проблемам, что и отсутствие движений.
После того как мы внесли необходимые изменения в наш самописный документ и убедились, что он формирует движения по регистру «Списанные товары», мы можем запустить автоматическое восстановление последовательности. Это можно сделать несколькими способами:
Операции -> Обработки -> Проведение по партиям.Сервис -> Универсальные обработки -> Групповая обработка справочников и документов, где выбираем перепроведение документов за нужный период.ЗаполнениеДокументов.ВыполнитьВосстановление.Важно убедиться, что период восстановления последовательности охватывает все даты, за которые были проведены документы «Затраты на хранение».
При интеграции самописных документов в типовые механизмы партионного учета, мы всегда должны помнить о нескольких критически важных аспектах:
Период).Таким образом, проблема с неперепроведением самописного документа при восстановлении последовательности в 1С:УТ 10.3 чаще всего связана с отсутствием необходимых движений по служебному регистру сведений «Списанные товары». Путем доработки модуля проведения документа или использования типовых механизмов мы можем добиться корректной работы нашего решения в рамках стандартной функциональности конфигурации.