Почему самописный документ в 1С:УТ 10.3 не перепроводится при автоматическом восстановлении последовательности и как это исправить?

Программист 1С v8.3 (Обычные формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

При работе с конфигурациями 1С, особенно такими как «Управление торговлей 10.3», часто возникает необходимость в разработке собственных документов для автоматизации уникальных бизнес-процессов. Однако, интеграция таких самописных решений в типовые механизмы, например, в автоматическое восстановление последовательности партионного учета, может быть сопряжена с определенными сложностями. В этой статье мы подробно разберем ситуацию, когда самописный документ не перепроводится при автоматическом восстановлении последовательности, выясним причины такого поведения и предложим пути решения.

Рассмотрим конкретный сценарий: разработчик создал в 1С:УТ 10.3 самописный документ под названием «Затраты на хранение». Этот документ предназначен для ежедневного начисления себестоимости на остатки регистра «Партии товаров на складах», при этом он не изменяет количество товаров. В системе настроено автоматическое восстановление последовательности, выполняемое по регламенту с помощью функции ЗаполнениеДокументов.ВыполнитьВосстановление. Однако при выполнении этой процедуры документ «Затраты на хранение» упорно отказывается перепроводиться.


ЗаполнениеДокументов.ВыполнитьВосстановление (ТекущаяДата(),
                                            Справочники.Организации.ПустаяСсылка(),
                                            Истина,
                                            Истина,
                                            Истина,
                                            Ложь,
                                            100,
                                            100);

Давайте выясним, почему так происходит, и как мы можем интегрировать наш самописный документ в механизм восстановления последовательности.

Понимание роли регистра сведений «Списанные товары»

Первоначально, изучая код механизма восстановления последовательности, мы обнаруживаем, что он активно взаимодействует с регистром сведений «Списанные товары». Наш самописный документ не формирует движений по этому регистру, что, по всей видимости, является причиной проблемы.

Что такое регистр сведений «Списанные товары» и зачем он нужен?

Регистр сведений «Списанные товары» в 1С:УТ 10.3 является ключевым служебным регистром. Его основная роль заключается в обеспечении корректного расчета себестоимости и поддержании механизма партионного учета. Он позволяет системе эффективно восстанавливать последовательность документов, затрагивающих партионный учет, без необходимости полного перепроведения всех документов с начала времен.

Функция этого регистра – обобщать информацию о расходе номенклатуры. Он действует как своего рода «интерфейс вызова» для механизма списания партий, делая алгоритмы списания независимыми от специфической структуры каждого первичного документа. Это крайне важно в условиях, когда суммы в движениях зависят от рассчитанной себестоимости списываемых товаров.

Партионный учет в УТ 10.3 и аналогичных конфигурациях строится на базе регистра оперативного учета «Себестоимость товаров». Регистр «Списанные товары» помогает формировать движения не только в этом регистре, но и в других регистрах партионного учета, таких как «Партии товаров на складах».

Как регистр «Списанные товары» связан с регистром «Партии товаров на складах»?

Регистр накопления «Партии товаров на складах» (или «Товары на складах» в некоторых версиях) хранит информацию об остатках товаров в разрезе партий и их себестоимости. Движения по этому регистру (приход и расход) формируются всеми документами, которые влияют на товародвижение.

Регистр сведений «Списанные товары», в свою очередь, содержит детализированную информацию о том, какие товары, в каком количестве и по какой себестоимости были списаны. Эта информация критически важна для двух основных процессов:

  1. Восстановление последовательности: При восстановлении последовательности система использует данные из «Списанных товаров», чтобы определить, какие именно партии из регистра «Партии товаров на складах» должны быть списаны, соблюдая при этом выбранную учетную политику (например, ФИФО).
  2. Расчет себестоимости: Он обеспечивает правильный расчет себестоимости, передавая данные о списании для дальнейших расчетов в регистре «Себестоимость товаров».

Таким образом, если наш самописный документ «Затраты на хранение» изменяет себестоимость в регистре «Партии товаров на складах», но не формирует соответствующих движений в «Списанные товары», система при восстановлении последовательности не видит, что этот документ участвует в процессах списания или влияет на них. Для нее он просто не является «списывающим» или «учитывающим себестоимость» документом в контексте партионного учета, и поэтому не перепроводится.

Анализ механизма перепроведения: функция ДвижениеПартийТоваров

В процессе восстановления последовательности, после того как система определяет, какие документы должны быть перепроведены, она обращается к общему модулю УправлениеЗапасамиПартионныйУчет и вызывает функцию ДвижениеПартийТоваров, передавая в нее ссылку на документ. Рассмотрим фрагмент кода, который показывает, как эта функция получает данные для движений:


// Движение партий товаров по документу
УправлениеЗапасамиПартионныйУчет.ДвижениеПартийТоваров (ДокументСсылка,
                                                         ,
                                                         КоличествоСтрокВДокументе,
                                                         Упр,
                                                         Бух,
                                                         Нал,
                                                         Останавливаться,
                                                         ПроведениеОстановлено,
                                                         ДокументМоментВремени,
                                                         Истина,
                                                         СтруктураНаборовЗаписей);

Внутри этой процедуры вызывается функция ПолучитьТаблицуСтрокДокументов, которая ищет движения в регистре сведений «Списанные товары». Если наш документ не создал записей в этом регистре, эта функция вернет пустую таблицу значений, что приведет к тому, что никаких движений по партионному учету для нашего документа сформировано не будет, и он фактически не будет перепроведен.


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

	Запрос.Текст = 
	"ВЫБРАТЬ
	|	""ПолучитьТаблицуСтрокДокументов"" КАК QuieryId ";
	
	Ресурсы = Метаданные.РегистрыСведений.СписанныеТовары.Ресурсы;
	
	Для каждого Ресурс Из Ресурсы Цикл
		
		Запрос.Текст = 	Запрос.Текст + ",
		|	"+ Ресурс.Имя;
		
	КонецЦикла; 
	
	Запрос.Текст = 	Запрос.Текст + ",
	|	Регистратор,
	|	Период,
	|	НомерСтроки,
	|	НомерСтрокиДокумента,
	|	Номенклатура.ВестиПартионныйУчетПоСериям КАК ВестиПартионныйУчетПоСериям,
	|	ВЫБОР
	|	КОГДА
	|	КодОперацииПартииТоваров = &ВозвратОтКомиссионера
	|	ИЛИ КодОперацииПартииТоваров = &РеализацияКомиссия
	|	ТОГДА ""Переданные""
	|	ИНАЧЕ
	|	""НаСкладах""
	|	КОНЕЦ КАК ИсточникПоКодуОперации
	|ИЗ
	|	РегистрСведений.СписанныеТовары КАК Строки";
	
	Если ДокументСписания <> Неопределено Тогда
	
		Запрос.Текст = Запрос.Текст+ "
		|ГДЕ
		|	Строки.Регистратор = &ДокументСписания";
	
	КонецЕсли; 
	
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "ОтражатьВУправленческомУчете", "(ОтражатьВУправленческомУчете И &Упр) КАК ОтражатьВУправленческомУчете");
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "ОтражатьВБухгалтерскомУчете", "(ОтражатьВБухгалтерскомУчете И &Бух) КАК ОтражатьВБухгалтерскомУчете");
	Запрос.Текст = СтрЗаменить(Запрос.Текст, "ОтражатьВНалоговомУчете", "(ОтражатьВНалоговомУчете И &Нал) КАК ОтражатьВНалоговомУчете");
	
	Результат = Запрос.Выполнить();

	Возврат Результат.Выгрузить();

КонецФункции //ПолучитьТаблицуСтрокДокументов

Как мы видим из приведенного выше кода, функция ПолучитьТаблицуСтрокДокументов напрямую обращается к регистру сведений СписанныеТовары, фильтруя записи по текущему документу-регистратору. Если в этом регистре нет записей, связанных с нашим документом, то функция вернет пустую таблицу, и дальнейшие расчеты себестоимости и формирование движений по партийному учету не состоятся.

Решения: Как заставить самописный документ перепроводиться

Для того чтобы наш самописный документ «Затраты на хранение» корректно перепроводился при автоматическом восстановлении последовательности в 1С:УТ 10.3, нам необходимо обеспечить формирование им движений в регистре сведений «Списанные товары». Рассмотрим несколько подходов к решению этой задачи.

  1. Доработка модуля проведения самописного документа

    Самый прямой и надежный способ – это внесение изменений непосредственно в модуль проведения документа «Затраты на хранение». Мы должны добавить код, который будет создавать необходимые записи в регистре «Списанные товары».

    Порядок действий:

    1. Изучаем структуру регистра: Прежде всего, нам нужно понять структуру регистра сведений «Списанные товары». Обычно он содержит измерения (например, Номенклатура, ХарактеристикаНоменклатуры, СерияНоменклатуры, Склад, Организация), ресурсы (Количество, СтоимостьУпр, СтоимостьБух, СтоимостьНал) и, что важно, поле Регистратор. Также могут присутствовать флаги учета (ОтражатьВУправленческомУчете, ОтражатьВБухгалтерскомУчете, ОтражатьВНалоговомУчете) и КодОперацииПартииТоваров.
    2. Формируем записи: В модуле проведения нашего документа, после расчета себестоимости и формирования движений по регистру «Партии товаров на складах», мы должны создать новый набор записей регистра «Списанные товары».
    3. Заполняем данные: Каждая запись должна отражать «списание» или влияние на себестоимость, даже если количество равно нулю. Важно указать следующие данные:
      • Регистратор: Ссылка на текущий документ «Затраты на хранение».
      • Период: Дата документа.
      • Номенклатура, Склад, Организация: Данные, по которым распределяются затраты.
      • Количество: В нашем случае это может быть 0, так как документ не списывает количество, а только влияет на себестоимость.
      • СтоимостьУпр, СтоимостьБух, СтоимостьНал: Суммы затрат, которые мы хотим «накрутить» на себестоимость. Эти суммы будут использоваться при перепроведении.
      • ОтражатьВУправленческомУчете, ОтражатьВБухгалтерскомУчете, ОтражатьВНалоговомУчете: Устанавливаем в зависимости от того, в каком виде учета мы хотим отразить затраты.
      • КодОперацииПартииТоваров: Можно использовать, например, Перечисления.КодыОперацийПартииТоваров.ПрочиеЗатраты или Перечисления.КодыОперацийПартииТоваров.Списание, если такой есть или его можно добавить. Это поможет типизировать характер движений.
    4. Записываем движения: Не забываем вызвать метод Записать(Истина) для набора записей регистра сведений, чтобы движения были сохранены в базе данных.

    Пример кода для модуля проведения (псевдокод, требует адаптации под вашу структуру):

    
    // ... (ваш основной код проведения документа) ...
    
    // Создаем движения по регистру сведений "СписанныеТовары"
    Движения.СписанныеТовары.Записывать = Истина;
    Для Каждого СтрокаТабличнойЧасти Из ТабличнаяЧастьСЗатратами Цикл
        НовоеДвижение = Движения.СписанныеТовары.Добавить();
        НовоеДвижение.Регистратор = Ссылка;
        НовоеДвижение.Период = Дата;
        НовоеДвижение.Организация = СтрокаТабличнойЧасти.Организация;
        НовоеДвижение.Номенклатура = СтрокаТабличнойЧасти.Номенклатура;
        НовоеДвижение.Склад = СтрокаТабличнойЧасти.Склад;
        НовоеДвижение.Количество = 0; // Или другое значение, если необходимо
        НовоеДвижение.СтоимостьУпр = СтрокаТабличнойЧасти.СуммаЗатрат; // Ваша логика расчета суммы
        НовоеДвижение.СтоимостьБух = СтрокаТабличнойЧасти.СуммаЗатрат;
        НовоеДвижение.СтоимостьНал = СтрокаТабличнойЧасти.СуммаЗатрат;
        НовоеДвижение.ОтражатьВУправленческомУчете = Истина;
        НовоеДвижение.ОтражатьВБухгалтерскомУчете = Истина;
        НовоеДвижение.ОтражатьВНалоговомУчете = Истина;
        // Возможно, потребуется установка КодОперацииПартииТоваров
        // НовоеДвижение.КодОперацииПартииТоваров = Перечисления.КодыОперацийПартииТоваров.ПрочиеЗатраты;
    КонецЦикла;
    // Движения автоматически запишутся при Записать(РежимПроведения)
    

    Этот подход гарантирует, что при каждом проведении нашего документа будут формироваться необходимые записи, которые затем будут обнаружены функцией ПолучитьТаблицуСтрокДокументов во время восстановления последовательности.

  2. Использование типовых механизмов или их аналогов

    Прежде чем приступать к глубокой доработке, всегда полезно рассмотреть, как подобные задачи решаются в типовой конфигурации. Возможно, функциональность, которую мы пытаемся реализовать самописным документом, уже есть в УТ 10.3 или может быть реализована с меньшими доработками.

    1. Дополнительные расходы на приобретение: В 1С:УТ 10.3 существует механизм документа «Поступление доп. расходов», который позволяет распределять дополнительные затраты (например, на доставку, хранение) на себестоимость уже пришедших товаров. Этот механизм изначально интегрирован в партионный учет и корректно формирует все необходимые движения, включая записи в регистре «Списанные товары» (косвенно, через механизм расчета себестоимости). Если наш документ «Затраты на хранение» по сути является распределением дополнительных расходов, возможно, лучше будет использовать этот типовой документ или адаптировать его под свои нужды.
    2. Анализ типовых документов: Изучите, как формируют движения по регистру «Списанные товары» типовые документы, которые влияют на себестоимость или списывают товары (например, «Реализация товаров и услуг», «Списание товаров», «Отчет о розничных продажах»). Это поможет нам понять логику и структуру движений, которые ожидаются системой. Мы можем адаптировать или повторно использовать часть этой логики в нашем самописном документе.
  3. Подписки на события или внешние обработки (менее предпочтительный вариант)

    Если прямое изменение модуля документа по каким-либо причинам нежелательно, можно рассмотреть создание внешней обработки или подписки на событие ПриЗаписи или ПриПроведении документа. Эти механизмы позволят нам формировать движения в регистре «Списанные товары» после проведения документа.

    Однако, этот подход является менее надежным для восстановления последовательности, так как требует обеспечения строгой хронологической очередности выполнения. При восстановлении последовательности система ожидает, что все движения, необходимые для ее расчетов, уже сформированы самим документом во время его проведения. Внешние механизмы могут работать с задержкой или быть отключены, что приведет к тем же проблемам, что и отсутствие движений.

Запуск восстановления последовательности

После того как мы внесли необходимые изменения в наш самописный документ и убедились, что он формирует движения по регистру «Списанные товары», мы можем запустить автоматическое восстановление последовательности. Это можно сделать несколькими способами:

  1. Через обработку «Проведение по партиям»: Операции -> Обработки -> Проведение по партиям.
  2. Через «Универсальную обработку справочников и документов»: Сервис -> Универсальные обработки -> Групповая обработка справочников и документов, где выбираем перепроведение документов за нужный период.
  3. С помощью регламентного задания, как это описано в начале статьи, используя функцию ЗаполнениеДокументов.ВыполнитьВосстановление.

Важно убедиться, что период восстановления последовательности охватывает все даты, за которые были проведены документы «Затраты на хранение».

Важные аспекты и рекомендации

При интеграции самописных документов в типовые механизмы партионного учета, мы всегда должны помнить о нескольких критически важных аспектах:

  1. Целостность данных: Любые изменения в механизмах учета должны быть тщательно протестированы, чтобы не нарушить целостность данных и корректность расчетов себестоимости.
  2. Регистр сведений «Списанные товары» может быть периодическим: Убедитесь, что записи в регистре «Списанные товары» правильно привязаны к регистратору и имеют корректную дату (Период).
  3. Учетная политика: Убедитесь, что логика формирования движений в регистре «Списанные товары» соответствует принятой учетной политике организации (например, ФИФО, ЛИФО, по средней).
  4. Избегайте прямого изменения типовых модулей: По возможности старайтесь использовать расширения конфигурации или внешние обработки. Однако в случае с глубокой интеграцией в механизмы расчета себестоимости и партионного учета, изменение типовых модулей проведения может быть неизбежным. В таком случае тщательно документируйте все изменения.

Таким образом, проблема с неперепроведением самописного документа при восстановлении последовательности в 1С:УТ 10.3 чаще всего связана с отсутствием необходимых движений по служебному регистру сведений «Списанные товары». Путем доработки модуля проведения документа или использования типовых механизмов мы можем добиться корректной работы нашего решения в рамках стандартной функциональности конфигурации.

← На главную