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