Рассмотрим ситуацию, с которой столкнулись пользователи конфигурации «Управление производственным предприятием» (УПП) ред. 1.3. После последовательного обновления до релиза 1.3.173.3 возникла проблема: документ Передача материалов в эксплуатацию перестал формировать движения по регистрам. При этом сам документ успешно проводился и получал статус «Проведен», но в регистрах бухгалтерии (Материалы на складах, Материалы в эксплуатации и других) не появлялось ни одной записи. Эта проблема может возникнуть независимо от того, какие виды учета (управленческий, бухгалтерский, налоговый) используются при проведении.
Проанализируем причину такого поведения и разберем несколько способов решения этой задачи, включая исправление программного кода.
Первичная диагностика с помощью отладчика показывает, что система при проведении документа как будто «не видит» строки его табличной части, хотя они заполнены пользователем. Это указывает на то, что проблема кроется на этапе формирования и выполнения запроса, который получает данные из документа для дальнейшей обработки.
Ключевая причина — ошибка в логике запроса внутри функции СформироватьЗапросПоТабличнойЧастиМатериалы, которая находится в модуле объекта документа ПередачаМатериаловВЭксплуатацию. Запрос некорректно соединяет данные табличной части документа с виртуальной таблицей остатков регистра бухгалтерии по налоговому учету.
Посмотрим на фрагмент кода из типовой конфигурации релиза 1.3.173.3:
|ВЫБРАТЬ
...
|ИЗ
| Документ.ПередачаМатериаловВЭксплуатацию.Материалы КАК Док
|
| ЛЕВОЕ СОЕДИНЕНИЕ
| СпособыОтраженияРасходов КАК СпособыОтраженияРасходов
| ПО
| Док.НазначениеИспользования.СпособОтраженияРасходов = СпособыОтраженияРасходов.СпособОтраженияРасходов
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Налоговый.Остатки(&ДатДок, , , ) КАК НалоговыйОстатки
| ПО Док.СчетУчетаНУ = НалоговыйОстатки.Счет
| И Док.Номенклатура = НалоговыйОстатки.Субконто1
| И Док.Ссылка.Склад = НалоговыйОстатки.Субконто2
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатДок, , , ) КАК ХозрасчетныйОстатки
| ПО Док.СчетУчетаБУ = ХозрасчетныйОстатки.Счет
| И Док.Номенклатура = ХозрасчетныйОстатки.Субконто1
| И Док.Ссылка.Склад = ХозрасчетныйОстатки.Субконто2
|ГДЕ
| Док.Ссылка = &ДокументСсылка
| И НалоговыйОстатки.ВидУчета = &НУ
|
|УПОРЯДОЧИТЬ ПО
| Док.НомерСтроки
Ошибка заключается в строке И НалоговыйОстатки.ВидУчета = &НУ, которая находится в секции ГДЕ. Когда условие накладывается на поля таблицы, присоединяемой через ЛЕВОЕ СОЕДИНЕНИЕ (в данном случае это НалоговыйОстатки), в секции ГДЕ, такое соединение фактически превращается во ВНУТРЕННЕЕ СОЕДИНЕНИЕ. Это означает, что если для какой-либо строки из табличной части документа не будет найдено остатка в регистре налогового учета (НалоговыйОстатки), то вся эта строка будет исключена из итоговой выборки. В результате запрос возвращает пустую таблицу, и обработка проведения документа завершается без создания движений.
Чтобы исправить такое поведение, необходимо перенести условие фильтрации по виду учета из секции ГДЕ в условия соединения ПО для таблицы НалоговыйОстатки. Это позволит сохранить все строки из табличной части документа в результате запроса, даже если для них нет остатков по налоговому учету.
Разберем по шагам, как внести исправления:
ПередачаМатериаловВЭксплуатацию.СформироватьЗапросПоТабличнойЧастиМатериалы(СтруктураШапкиДокумента).ГДЕ и удалите из нее строку: И НалоговыйОстатки.ВидУчета = &НУ.ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Налоговый.Остатки(...) и добавьте удаленное условие в конец блока ПО.Фрагмент кода до исправления:
...
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Налоговый.Остатки(&ДатДок, , , ) КАК НалоговыйОстатки
| ПО Док.СчетУчетаНУ = НалоговыйОстатки.Счет
| И Док.Номенклатура = НалоговыйОстатки.Субконто1
| И Док.Ссылка.Склад = НалоговыйОстатки.Субконто2
...
|ГДЕ
| Док.Ссылка = &ДокументСсылка
| И НалоговыйОстатки.ВидУчета = &НУ
...
Фрагмент кода после исправления:
...
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Налоговый.Остатки(&ДатДок, , , ) КАК НалоговыйОстатки
| ПО Док.СчетУчетаНУ = НалоговыйОстатки.Счет
| И Док.Номенклатура = НалоговыйОстатки.Субконто1
| И Док.Ссылка.Склад = НалоговыйОстатки.Субконто2
| И НалоговыйОстатки.ВидУчета = &НУ // ++ Условие перенесено сюда
...
|ГДЕ
| Док.Ссылка = &ДокументСсылка
// -- Строка отсюда удалена
...
После внесения этих изменений сохраните конфигурацию. Важно: чтобы изменения вступили в силу для уже созданных документов, их необходимо будет перепровести.
Если внесение изменений в код по каким-то причинам затруднительно, можно воспользоваться более простым, но менее гибким решением — заменить весь модуль объекта документа ПередачаМатериаловВЭксплуатацию на версию из предыдущего релиза (например, 1.3.167), где этой ошибки не было.
Этот способ имеет существенный недостаток: вы потеряете все остальные исправления и нововведения, которые были внесены в этот модуль в обновлении 1.3.173.3. Применять его стоит только как временную меру до выхода официального исправления от разработчика.
Стоит отметить, что описанная проблема является официально зарегистрированной ошибкой в релизе УПП 1.3.173.3. Она связана с некорректной логикой списания количества в налоговом учете, особенно при работе с несущественными активами.
В качестве временного обходного пути, не требующего вмешательства в конфигурацию, можно использовать альтернативный документ:
В этом документе можно выбрать вид операции «Передача сотруднику», что позволит отразить факт выдачи материалов. Механизм проведения этого документа отличается от «Передачи материалов в эксплуатацию» и не затронут данной ошибкой.
Таким образом, наиболее правильным решением является исправление кода запроса, так как оно точечно устраняет причину проблемы, сохраняя при этом все остальные изменения релиза.