Как использовать реквизит формы или сторонние данные в режиме Вычислять обработки Загрузка данных из табличного документа

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

При работе со стандартной консольной обработкой «Загрузка данных из табличного документа» программисты часто сталкиваются с необходимостью производить сложные расчеты «на лету». Типичный пример: в файле Excel указана цена в валюте, а загрузить ее нужно в рублях по определенному курсу. Казалось бы, достаточно добавить реквизит Курс на форму обработки и использовать его в формуле, но здесь нас ждет техническое препятствие.

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

Почему не получается обратиться к реквизиту формы напрямую

Разберем ситуацию: вы открыли обработку, добавили на ее форму (через конфигуратор или программно) поле Курс. В настройках загрузки для колонки «Цена» вы выбрали режим «Вычислять» и написали код:

Результат = Число(ТекстыЯчеек.Получить(2)) * Курс;

При попытке загрузки система выдаст ошибку, что переменная Курс не определена. Это происходит потому, что программный код в поле «Вычислять» исполняется с помощью функции Вычислить() (или Выполнить()) в изолированном контексте. В этом контексте «видны» только те переменные, которые явно переданы в функцию внутри самой обработки. Обычно это ТекстыЯчеек, ТекстоваяСтрока, НомерСтроки и Результат. Реквизиты самой формы в этот список не входят.

Решение 1: Получение данных напрямую из базы (Регистры сведений)

Наиболее правильным и автоматизированным способом будет получение курса валюты непосредственно из базы данных внутри формулы. Это избавляет пользователя от необходимости вручную вводить курс на форме.

Проанализируем пример кода для поля «Вычислять», где мы получаем актуальный курс доллара:


// Получаем валюту (например, USD)
ВалютаСсылка = Справочники.Валюты.НайтиПоКоду("840");
// Получаем курс на текущую дату
СтруктураКурса = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(ТекущаяДата(), Новый Структура("Валюта", ВалютаСсылка));
// Умножаем цену из 3-й колонки (индекс 2) на полученный курс
Результат = Число(СтрЗаменить(ТекстыЯчеек.Получить(2), " ", "")) * СтруктураКурса.Курс / ?(СтруктураКурса.Кратность = 0, 1, СтруктураКурса.Кратность);

Обратите внимание на использование функции СтрЗаменить. Это критически важный момент, так как в ячейках Excel часто встречаются неразрывные пробелы в числах (например, "1 250.50"), которые мешают функции Число() корректно преобразовать строку.

Решение 2: Использование фиксированного значения для разовых загрузок

Если загрузка разовая и курс не будет меняться в процессе обработки файла, проще всего указать значение курса прямо в формуле. Это быстрее, чем дорабатывать форму обработки.

Рассмотрим по шагам:

  1. Выясните текущий курс (например, 92.5).
  2. В поле «Вычислять» пропишите простую арифметику.

// 2 — это индекс колонки в таблице (третья по счету)
ЦенаВВалюте = Число(СтрЗаменить(ТекстыЯчеек.Получить(2), Символы.НПП, ""));
Результат = ЦенаВВалюте * 92.5;

Решение 3: Использование параметров сеанса или глобальных переменных

Если вам все же необходимо передать значение именно с формы, и вы можете немного подправить код конфигурации (или используете расширение), можно воспользоваться временным хранилищем в виде параметров сеанса.

Алгоритм действий:

  1. Перед запуском обработки загрузки запишите курс в параметр сеанса (например, в существующий подходящий по типу или специально созданный).
  2. В формуле загрузки обратитесь к этому параметру.

Пример кода в поле «Вычислять»:

Результат = Число(ТекстыЯчеек[2]) * ПараметрыСеанса.ТекущийКурсДляЗагрузки;

Важно: Этот метод требует прав на изменение конфигурации и понимания того, что параметр сеанса доступен во всем сеансе работы пользователя.

Решение 4: Добавление курса в сам исходный файл (Lifehack)

Если вы не хотите писать сложные запросы к базе или менять конфигурацию, можно пойти на хитрость. Добавьте в ваш файл Excel еще одну колонку и заполните её нужным курсом для всех строк. Тогда в обработке вы сможете просто обратиться к этой колонке через массив ТекстыЯчеек.


// Допустим, цена в колонке 3 (индекс 2), а курс в колонке 4 (индекс 3)
Результат = Число(ТекстыЯчеек[2]) * Число(ТекстыЯчеек[3]);

Особенности работы с массивом ТекстыЯчеек

Разберем подробнее объект ТекстыЯчеек, который является основным инструментом в режиме вычисления:

Итоги и рекомендации

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

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

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

← На главную