Почему не переносится колонка "Сумма" при загрузке из внешних файлов в 1С 11.4.7?

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

Приветствуем коллег! Сегодня мы подробно разберем крайне интересную техническую проблему, с которой часто сталкиваются разработчики и аналитики при обновлении типовых конфигураций 1С (таких как «Управление торговлей», «Комплексная автоматизация» или «1С:ERP») до версии 11.4.7 и выше. Суть проблемы заключается в том, что при использовании стандартной обработки «Загрузка данных из внешних файлов» для заполнения табличных частей документов колонка «Сумма» упорно отказывается переноситься в документ, даже если в параметрах формы явно указано свойство загрузки сумм.

Давайте вместе разберемся, почему на релизе 11.4.6 все работало корректно, а в 11.4.7 поведение системы изменилось. Мы проанализируем внутренние механизмы конфигурации, выявим архитектурную причину этой ошибки и рассмотрим несколько практических способов ее решения — от простых пользовательских лайфхаков до профессиональной доработки кода.

Выясняем техническую причину проблемы: почему «затирается» сумма?

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

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

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

Логика работы этого действия проста и прямолинейна: сумма в строке рассчитывается по формуле Сумма = Цена * Количество. Если в вашем загружаемом файле Excel колонка «Цена» осталась пустой (равной нулю), то система выполняет расчет:

0 * Количество = 0

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

Способ 1. Решение на уровне кода: использование управляющих параметров формы

Если у вас есть доступ к конфигуратору (или вы разрабатываете расширение для документа), наиболее правильным и чистым решением будет правильная настройка параметров запуска формы загрузки данных. Мало кто знает, но в программном интерфейсе БСП (Библиотеки стандартных подсистем) помимо параметров ЗагружатьЦены и ЗагружатьСуммы существует еще один важный параметр — ПересчитыватьСуммы.

Давайте проанализируем стандартную процедуру вызова формы загрузки из внешнего файла и внесем в нее исправления. Ниже представлен код вызова с внедренным решением:


&НаКлиенте
Процедура ЗагрузитьИзВнешнегоФайла(Команда)
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("ЗагружатьЦены", Истина);
    ПараметрыФормы.Вставить("ЗагружатьСуммы", Истина);
    
    // Внедряем ключевое исправление: запрещаем автоматический пересчет сумм при переносе в ТЧ
    ПараметрыФормы.Вставить("ПересчитыватьСуммы", Ложь);
    
    ПараметрыФормы.Вставить("ЦенаВключаетНДС", Объект.ЦенаВключаетНДС);
    ПараметрыФормы.Вставить("НалогообложениеНДС", Объект.НалогообложениеНДС);
    ПараметрыФормы.Вставить("ВернутьМногооборотнуюТару", Объект.ВернутьМногооборотнуюТару);
    ПараметрыФормы.Вставить("Партнер", Объект.Partner);
    ПараметрыФормы.Вставить("СопоставлятьПоНоменклатуреПоставщиков", Истина);
    
    // Задаем отборы в зависимости от хозяйственной операции
    Если Объект.ХозяйственнаяОперация = ПредопределенноеЗначение("Перечисление.ХозяйственныеОперации.ПриемНаКомиссию") Тогда
        ПараметрыФормы.Вставить("ОтборПоТипуНоменклатуры", Новый ФиксированныйМассив(НоменклатураКлиентСервер.ОтборПоТоваруМногооборотнойТаре));
        ЗагружатьСкидки = Ложь;
    Иначе
        ЗагружатьСкидки = Истина;
    КонецЕсли;
    
    ПараметрыФормы.Вставить("ЗагружатьСкидки", ЗагружатьСкидки);
    
    ОткрытьФорму(
        "Обработка.ЗагрузкаДанныхИзВнешнихФайлов.Форма.Форма",
        ПараметрыФормы,
        ЭтаФорма,
        УникальныйИдентификатор
    );
КонецПроцедуры

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

Способ 2. Обходной путь через перехват Временного Хранилища

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

Давайте разберем этот алгоритм по шагам:

  1. В модуле формы документа мы перехватываем момент возврата структуры с адресом временного хранилища.
  2. Получаем таблицу значений с загруженными строками из хранилища на сервере.
  3. Программно обходим строки этой таблицы. Если в строке заполнена сумма, но отсутствует цена, мы можем принудительно рассчитать техническую цену: Цена = Сумма / Количество.
  4. Записываем измененную таблицу обратно в хранилище и передаем ее стандартному обработчику БСП.

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


&НаСервере
Процедура СкорректироватьДанныеПередЗагрузкой(АдресХранилища)
    ДанныеЗагрузки = ПолучитьИзВременногоХранилища(АдресХранилища);
    
    // Предполагаем, что данные возвращаются в виде ТаблицыЗначений
    Если ТипЗнч(ДанныеЗагрузки) = Тип("ТаблицаЗначений") Тогда
        Для Каждого СтрокаДанных Из ДанныеЗагрузки Цикл
            // Если сумма загружена, а цена пустая - рассчитываем цену искусственно
            Если СтрокаДанных.Сумма > 0 И (Не ЗначениеЗаполнено(СтрокаДанных.Цена) Или СтрокаДанных.Цена = 0) Тогда
                Если СтрокаДанных.Количество > 0 Тогда
                    СтрокаДанных.Цена = СтрокаДанных.Сумма / СтрокаДанных.Количество;
                КонецЕсли;
            КонецЕсли;
        КонецЦикла;
        
        // Помещаем скорректированную таблицу обратно в хранилище
        ПоместитьВоВременноеХранилище(ДанныеЗагрузки, АдресХранилища);
    КонецЕсли;
КонецПроцедуры

Этот способ гарантирует, что при последующем срабатывании стандартного механизма пересчета БСП формула Цена * Количество выдаст ровно ту сумму, которая изначально находилась в загружаемом файле Excel, и данные не обнулятся.

Способ 3. Пользовательское решение: корректировка исходного файла Excel

Что делать обычным пользователям или бухгалтерам, если ошибка проявилась прямо во время отчетного периода, а программиста 1С нет под рукой для оперативного внесения изменений в код или расширения?

В этой ситуации проблему можно обойти исключительно организационными методами и правильной подготовкой загружаемого файла Excel. Мы рекомендуем воспользоваться следующей простой инструкцией:

  1. Откройте ваш исходный файл Excel, подготовленный для загрузки в 1С.
  2. Убедитесь, что формат ячеек во всех числовых колонках («Количество», «Цена», «Сумма») явно установлен как Числовой. Текстовый формат чисел в Excel часто приводит к сбоям сопоставления типов в 1С.
  3. Если в вашем файле заполнена только колонка «Сумма», а колонка «Цена» отсутствует, обязательно добавьте колонку «Цена».
  4. Заполните колонку «Цена» в Excel с помощью простой формулы: разделите значение ячейки «Сумма» на ячейку «Количество». Протяните формулу на все строки таблицы.
  5. Сохраните файл и повторите процедуру загрузки в 1С, сопоставив все три колонки: Количество, Цена и Сумма.

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

Мы надеемся, что данный детальный разбор механизмов БСП поможет вам быстро и элегантно справиться с проблемой пропадания сумм при загрузке внешних файлов в любых современных конфигурациях на платформе 1С:Предприятие 8.3!

← На главную