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