Бухгалтера столкнулись с проблемой развёрнутого сальдо на счёте 68.02
Откуда ноги растут стандартными методами разобраться не удалось (бывают глюки, когда решает проблему пересчёт итогов, но тут он не помог, визуальный анализ достаточно продвинутыми консультантами проводок БУ также не дал результата).
Анамнез показал, что в предыдущих месяцах развернутого сальдо не было…
Начали формировать в консоли проверочные запросы к регистру бухгалтерии и многие были без толку, пока не вывели типы значений измерений.
И дьявол кроется в мелочах…
Оказалось значение пусто да не так как нужно
Сравнили результат запроса к регистру хозрасчетный по регистратору в текущей базе и архиве
ВЫБРАТЬ РАЗЛИЧНЫЕ
ХозрасчетныйОбороты.Регистратор КАК Документ,
ХозрасчетныйОбороты.Счет КАК Счет,
ХозрасчетныйОбороты.Счет.Валютный КАК СчетВалютный,
ТИПЗНАЧЕНИЯ(ХозрасчетныйОбороты.Валюта) КАК Тип_Валюта,
ХозрасчетныйОбороты.Валюта КАК Валюта,
ХозрасчетныйОбороты.Счет.УчетПоПодразделениям КАК СчетУчетПоПодразделениям,
ТИПЗНАЧЕНИЯ(ХозрасчетныйОбороты.Подразделение) КАК Тип_Подразделение,
ХозрасчетныйОбороты.Подразделение КАК Подразделение,
ХозрасчетныйОбороты.Счет.УчетПоНаправлениямДеятельности КАК СчетУчетПоНаправлениямДеятельности,
ТИПЗНАЧЕНИЯ(ХозрасчетныйОбороты.НаправлениеДеятельности) КАК Тип_НаправлениеДеятельности,
ХозрасчетныйОбороты.НаправлениеДеятельности КАК НаправлениеДеятельности
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(
&Дата1,
&Дата2,
Регистратор,
,
,
,
,
) КАК ХозрасчетныйОбороты
ГДЕ
ХозрасчетныйОбороты.Регистратор = &Регистратор
Рис.1 Неправильный вариант заполнения
Рис.1 Правильный вариант заполнения
ПРАВИЛО:
В случае отключенного на счете признака ведения учета, соответствующее измерение должно быть не ПустаяСсылка справочника, а равняться NULL.
Например, на счете 68.02 отключены учеты: Валютный, Учет по подразделениям и Учет по направлениям деятельности.
и поэтому в проводках по 68.02 счету пустые значения Валюты, Подразделения и Направления деятельности должны равняться NULL (как на рис.2), а не пустым ссылкам справочников (рис.1).
Разбираясь откуда такая "котовасия" появилась, выяснили что для редактирования движений документов использовали обработку Универсальный редактор реквизитов.
который в режиме Загрузка.ОбменДанными = Истина записывает пустые ссылки на справочники в поля проводки, которые не используются по признакам учета в счете.
Для исправления в обработку Универсальный редактор реквизитов (популярная вещь, на инфостарте поиском можете найти) в модуль формы в процедуру ЗаписатьДвижения() внесены исправления
Текст кода с исправлениями
Процедура ЗаписатьДвижения()
мдОбъекта = ВыбСсылка.Метаданные();
ВыбОбъект = ВыбСсылка.ПолучитьОбъект();
Для каждого мдРегистра Из мдОбъекта.Движения Цикл
Если Метаданные.РегистрыБухгалтерии.Содержит(мдРегистра) Тогда
ИмяРеквизитаФормы = "lyayРБ" + мдРегистра.Имя;
ИначеЕсли Метаданные.РегистрыНакопления.Содержит(мдРегистра) Тогда
ИмяРеквизитаФормы = "lyayРН" + мдРегистра.Имя;
ИначеЕсли Метаданные.РегистрыРасчета.Содержит(мдРегистра) Тогда
ИмяРеквизитаФормы = "lyayРР" + мдРегистра.Имя;
ИначеЕсли Метаданные.РегистрыСведений.Содержит(мдРегистра) Тогда
ИмяРеквизитаФормы = "lyayРС" + мдРегистра.Имя;
КонецЕсли;
НаборЗаписей = ВыбОбъект.Движения[мдРегистра.Имя];
НаборЗаписей.Прочитать();
Если ПоказыватьТолькоРегистрыСДвижениями И НаборЗаписей.Количество() = 0 Тогда
Продолжить
КонецЕсли;
НаборЗаписей.ОбменДанными.Загрузка = РежимЗаписиЗагрузка;
НаборЗаписей.Очистить();
тзРеквизитФормы = РеквизитФормыВЗначение(ИмяРеквизитаФормы);
НаборЗаписей.Загрузить(тзРеквизитФормы);
//+ Исправление
Если мдРегистра.Имя = "Хозрасчетный" Тогда
Валюта_ПустаяСсылка = Справочники.Валюты.ПустаяСсылка();
Подразделение_ПустаяСсылка = Справочники.СтруктураПредприятия.ПустаяСсылка();
НаправлениеДеятельности_ПустаяСсылка = Справочники.НаправленияДеятельности.ПустаяСсылка();
Для Каждого Запись_НЗ Из НаборЗаписей Цикл
Если НЕ Запись_НЗ.СчетДт.Валютный
И Запись_НЗ.ВалютаДт = Валюта_ПустаяСсылка Тогда
Запись_НЗ.ВалютаДт = NULL;
КонецЕсли;
Если НЕ Запись_НЗ.СчетКт.Валютный
И Запись_НЗ.ВалютаКт = Валюта_ПустаяСсылка Тогда
Запись_НЗ.ВалютаКт = NULL;
КонецЕсли;
Если НЕ Запись_НЗ.СчетДт.УчетПоПодразделениям
И Запись_НЗ.ПодразделениеДт = Подразделение_ПустаяСсылка Тогда
Запись_НЗ.ПодразделениеДт = NULL;
КонецЕсли;
Если НЕ Запись_НЗ.СчетКт.УчетПоПодразделениям
И Запись_НЗ.ПодразделениеКт = Подразделение_ПустаяСсылка Тогда
Запись_НЗ.ПодразделениеКт = NULL;
КонецЕсли;
Если НЕ Запись_НЗ.СчетДт.УчетПоНаправлениямДеятельности
И Запись_НЗ.НаправлениеДеятельностиДт = НаправлениеДеятельности_ПустаяСсылка Тогда
Запись_НЗ.НаправлениеДеятельностиДт = NULL;
КонецЕсли;
Если НЕ Запись_НЗ.СчетКт.УчетПоНаправлениямДеятельности
И Запись_НЗ.НаправлениеДеятельностиКт = НаправлениеДеятельности_ПустаяСсылка Тогда
Запись_НЗ.НаправлениеДеятельностиКт = NULL;
КонецЕсли;
КонецЦикла;
КонецЕсли;
//- Исправление
НаборЗаписей.Записать();
КонецЦикла;
КонецПроцедуры
Некорректных изменений в базе оказалось множество и не только по 68.02 счету, поэтому написал обработку, которая выявила все некорректные проводки БУ и исправила их (саму обработку можно скачать ниже):
Как она работает:
- Задаем настройки (Выбираем период исправления, отмечаем какие ошибки искать)
- Жмём кнопку [ Заполнить документы с ошибками] (Выводится список регистраторов у которых есть проводки с неправильными пустыми значениями)
- Отмечаем флажками строки
- Жмём кнопку [ Исправить на NULL ] (Обработка исправляет пустые ссылки справочника на NULL в изменениях Валюта, Подразделение, Направление деятельности по которым не установлен признак учета в счете)
В итоге исправилось неправильно возникшее развернутое сальдо:
Рис.3 Ошибочная Оборотно-сальдовая ведомость (с ошибкой развернутого сальдо)
Рис.4 Исправленная Оборотно-сальдовая ведомость (развернутое сальдо "свернулось")
P.S. Тем не менее, Универсальный редактор реквизитов, замечательная вещь!
Апдейты обработки:
Версия для скачивания: Проверка и правка на NULL в измерениях Хозрасчетный, по которым не ведется учет (для ERP, КА) 2024-12-17 Perl Amutor
Спасибо моему коллеге Владу, PerlAmutor IC ( //infostart.ru/profile/527156/ ) за исправления:
Воспользовался обработкой, но пришлось её немного "допилить". Первая проблема с которой я столкнулся это то, что после её работы остались документы, где нет NULL. Стал разбираться в запросе и понял, что виртуальная функция Обороты() — схлопывает в 0 суммы для некоторых документов и в этом случае, вообще их не показывает, считая, что оборотов — не было. Второе, что мне показалось странным — документы могут перезаписываться по несколько раз. Этого не происходит т.к. на первом цикле исправляются все движения, но они повторно перечитываются и вхолостую гоняются по циклу. Третье это то, что исправляются в любом случае Валюта, Подразделение и Направление деятельности в независимости от того какие отборы пользователь установил флажками. Четвертая проблема в том, что идет сравнение значений записи на пустую ссылку справочников, хотя по факту там могут стоять и Неопределено и все что угодно. С удивлением обнаружил то, что метод Модифицированность() у набора значений не работает, либо я не понимаю как он работает, если я меняю значение записи, но флаг не взводится. В общем все это дело я поправил и даю тебе ссылку на исправленную версию обработки.
Судя по описанию, сломано было не стандртными методами ведения документов?
(1) Всё стандартно и типово =) Записью любых движений через универсальный редактор реквизитов портились проводки документов и ещё одним самописным документом, который проводки формировал без учета признаков ведения учете.
Сталкивался с этой проблемой пару лет назад. Причиной была обработка одного программиста, которая программно создавала самописные документы и ставила в реквизиты субконто пустое значение определённого типа, хотя этим видам субконто не задавались значения. В результате в РБ попадали не Неопределено, а пустые ссылки. И тоже задваивались в типовых отчётах.
И я бы хотел обратить внимание, что всё же не NULL надо писать в субконто, а Неопределено.
Следствием тут будет исправление не отчётов, которые лишь выводят данные, а обработки проведения конкретных документов, которые неоднозначно трактуют пустые значения субконто.
Отлично, что освещена такая нетривиальная проблема!
(3) да с субконто тоже бывает =) но там точно не NULL, вы правильно написали (Неопределено). В учетных же измерениях именнно NULL.
(0) крутое расследование! молодцы!
Вывод: обработки с Инфостарта — зло
(5) Будьте любезны продемонстрируйте этот NULL
только не запросом, а открытием формы регистра, чтобы виден был этот NULL.
Ибо я считаю, что NULL не может показываться нигде в реквизитах иди измерениях, только через запрос к этим реквизитам или измерениям, потому что в них установлено именно = Неопределено
А устанавливается везде именно «Неопределено» — это вроде как свидетель для NULL в 1С
Проблемы с NULL в измерениях регистра бухгалтерии исправляются стандартной процедурой тестирования и изменения данных. Использование самописных обработок чревато тем, что могут «поехать» обороты и остатки за прошлые периоды по регистру бухгалтерии.
Вообще еще не встречал ни одной базы БП, где бы не было этой проблемы в той или иной степени. Обычно это не мешает т.к. в типовых отчетах, вроде ОСВ по счету, не используются развернутые остатки.
(6) и не говори =))) что есть то есть
(8) аудиторам почему-то помешало развернутое сальдо (и часто ТиИ сделать не можем в режиме работы 24/7 или в 24/6 где база оч большая и процесс идет больше суток, хотя оно часто помогает)
(6) Прям как в том анекдоте про ученого-экспериментатора:
«Вывод: без ног не слышит!»
(11)
это когда таракан без лапок убежать не мог, когда на него кричали )))
А у меня используется универсальный редактор реквизитов от Трактора.
Исправление у вас неправильное, так как заточено именно под БП 3.0 и надо делать проверки на существования указанных справочников в метаданных.
(13) Если используется, то откройте документ с движениями по БУ.
1) Возьмите текст запроса из моей публикации, выведите им результат (он покажет тип Валюты = NULL)
2) Откройте документ в универсальном редакторе реквизитов от Трактора, включите «Режим Записи: Загрузка без проверок» запишите движения. Затем посмотрите через консоль запросов тип поля валюта в проводке станет Справочник.Валюты.ПустаяСсылка.
Получилось?
P.S. уточню, что ситуация была не на БП 3.0, а на ERP 2.4.8.98 и 2.4.7.151 и речь не о типах субконто, а именно об измерениях, учет по которым включается на счете. По субконто и правда надо правильно типы выбирать и все будет Ок, но эта история не про них.
Я говорю о том, что для универсальной обработки исправление неправильное.
обработки с Инфостарта — зло, когда их используют кривые руки
(16) исправление правильное, т.к. исправило ошибку.
Тогда это будет не универсальная обработка, так как в ней будут фигурировать конкретные справочники.
Вы вообще прочитали всё, что я написал, или что было выгодно прочитать?
Обработка от Трактора признана одной из лучших на Инфостарте
(18) Прочитал и картинки приложил, смотрите. (вашими обработками постоянно пользуюсь, спасибо за их создание, но тут вы зря напали, т.к. ошибка есть в УРР и РБ.Хозрасчетный и ПланСчетов.Хозрасчетный универсальные объекты, универсально исправлены.)
(19) ни кто и не спорит я так в титрах и написал, что отличная вещь. Тем не менее факт нарушения проводок при ее использовании появился на практике.
(7) честно не совсем понимаю что от меня хотите, там запрос прямо в тексте публикации проверочный. Возьмите документ с проводками по БУ и сформируйте следующий запрос. На счете без признака валютный в поле валюта будет тип значения NULL (ставьте где хотите Неопределено, главное чтобы в итоге тип оставался NULL)
ВЫБРАТЬ РАЗЛИЧНЫЕ
ХозрасчетныйОбороты.Регистратор КАК Документ,
ХозрасчетныйОбороты.Счет КАК Счет,
ХозрасчетныйОбороты.Счет.Валютный КАК СчетВалютный,
ТИПЗНАЧЕНИЯ(ХозрасчетныйОбороты.Валюта) КАК Тип_Валюта,
ХозрасчетныйОбороты.Валюта КАК Валюта,
ХозрасчетныйОбороты.Счет.УчетПоПодразделениям КАК СчетУчетПоПодразделениям,
ТИПЗНАЧЕНИЯ(ХозрасчетныйОбороты.Подразделение) КАК Тип_Подразделение,
ХозрасчетныйОбороты.Подразделение КАК Подразделение,
ХозрасчетныйОбороты.Счет.УчетПоНаправлениямДеятельности КАК СчетУчетПоНаправлениямДеятельности,
ТИПЗНАЧЕНИЯ(ХозрасчетныйОбороты.НаправлениеДеятельности) КАК Тип_НаправлениеДеятельности,
ХозрасчетныйОбороты.НаправлениеДеятельности КАК НаправлениеДеятельности
ИЗ
РегистрБухгалтерии.Хозрасчетный.Обороты(
&Дата1,
&Дата2,
Регистратор,
,
,
,
,
) КАК ХозрасчетныйОбороты
ГДЕ
ХозрасчетныйОбороты.Регистратор = &Регистратор
(22) Да, думаю, он об этом. Что и в измерения надо при проведении документа ставить Неопределено. А NULL — он только в запросах бывает.
Спасибо, полезная статья )
(22) Спасибо большое… Кое что открыл для себя!
(23) на самом деле такие присвоение
=Неопределено
=Null
Сейчас равноценны, ибо приводят к одинаковому результату
(18) Всегда найдутся умники которые умнее всех. Не превращайте этот форум в беспонтовую mista. Если есть что сказать по теме говорите если нет лучше промолчать.
У меня не было такой ситуации, но есть подозрение, что тестирование и исправление исправляет эту ошибку, хотя вы пишите пересчёт итогов тут точно не поможет… комплексное тестирование как раз меняло значение субконто на верные. трабл в 1с известный
(28) ну тут не субконто, а измерения, и в комментарии № 9 я давал ответ по ТиИ
(0) Тема началась, как минимум в 2009. Что нового?
Добрый день,
Тестирую на конфигурации: Бухгалтерия предприятия, редакция 3.0 (3.0.74.51).
Получаю ошибку:
Выборка = Запрос.Выполнить().Выбрать();
по причине:
{(31, 32)}: Неверные параметры «Справочник.СтруктураПредприятия.ПустаяСсылка»
И Подразделение = ЗНАЧЕНИЕ(<<?>>Справочник.СтруктураПредприятия.ПустаяСсылка),
Справочника СтруктрураПредприятия в БП 3.0 действительно нет (также как и справочника НаправленияДеятельности).
В описании к разработке не указано, с какой конфигурацией она работает, соответственно я предположил, что со всеми, где есть регистр Хозрасчётный, а также справочники подразделений и валют.
(31) спасибо, переслал вам обработку для БП личным сообщением. В публикацию также добавил для БП (тип подразделения изменил на БП-шный и убрал направление деятельности, которого нет в БП). Исходная ситуация была на ЕРП (поэтому типы ЕРП-шные), но по аналогии и в БП возможна..
(32) Спасибо. Работает.