В процессе работы с документами в 1С часто возникает необходимость автоматизировать рутинные операции, такие как установка одной цены для множества позиций или массовый импорт номенклатуры. Рассмотрим подробно, как реализовать механизм группового изменения цен в выделенных строках табличной части и разберем современные способы загрузки данных из Excel, XML и PDF.
Представим ситуацию: в документе «Заказ» менеджер выбирает несколько строк с товарами и хочет одним действием назначить им общую цену. Для этого нам понадобится добавить команду на форму и написать небольшой алгоритм. Проанализируем, как это работает в управляемом приложении.
Основной секрет кроется в свойстве элемента формы ВыделенныеСтроки. Оно возвращает массив идентификаторов строк, которые пользователь выделил мышкой (удерживая Ctrl или Shift). Чтобы изменить данные в этих строках, нам нужно выполнить следующие шаги:
Разберем пример кода, который можно разместить в модуле формы документа:
&НаКлиенте
Процедура УстановитьЦенуДляВыделенных(Команда)
// Получаем массив идентификаторов выделенных строк
ВыделенныеСтроки = Элементы.Товары.ВыделенныеСтроки;
Если ВыделенныеСтроки.Количество() = 0 Тогда
ПоказатьПредупреждение(, "Пожалуйста, выделите хотя бы одну строку в таблице товаров!");
Возврат;
КонецЕсли;
// Используем стандартный метод платформы для ввода значения
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеВводаЦены", ЭтотОбъект);
ПоказатьВводЧисла(ОписаниеОповещения, 0, "Введите новую цену для выбранных строк:");
КонецПроцедуры
&НаКлиенте
Процедура ПослеВводаЦены(Результат, ДополнительныеПараметры) Экспорт
Если Результат = Неопределено Тогда
Возврат; // Пользователь нажал Отмена
КонецЕсли;
// Передаем управление на сервер для изменения данных
ИзменитьЦенуНаСервере(Результат);
КонецПроцедуры
&НаСервере
Процедура ИзменитьЦенуНаСервере(НоваяЦена)
ВыделенныеСтроки = Элементы.Товары.ВыделенныеСтроки;
Для Каждого ИдентификаторСтроки Из ВыделенныеСтроки Цикл
// Находим строку в данных объекта по идентификатору
ТекущаяСтрока = Объект.Товары.НайтиПоИдентификатору(ИдентификаторСтроки);
Если ТекущаяСтрока <> Неопределено Тогда
ТекущаяСтрока.Цена = НоваяЦена;
// Важно вызвать пересчет суммы строки
ТекущаяСтрока.Сумма = ТекущаяСтрока.Количество * ТекущаяСтрока.Цена;
КонецЕсли;
КонецЦикла;
// Не забываем обновить итоги по всему документу
// (Если в конфигурации есть типовая процедура пересчета, лучше вызвать ее)
КонецПроцедуры
Обратите внимание на использование метода НайтиПоИдентификатору. Это критически важный момент для управляемых форм, так как ВыделенныеСтроки содержит именно внутренние числовые индексы (ID) строк, а не сами строки данных.
Проанализируем ситуацию, если вы работаете в современной конфигурации (УТ 11, ERP, БП 3.0). В них уже встроена мощная подсистема «Редактирование выделенных строк». Вместо разработки собственной формы, вы можете подключить стандартную обработку БСП. Она позволяет пользователю менять не только цену, но и любое другое поле (склад, ставку НДС, подразделение) сразу во всех выделенных строках. Это считается «хорошим тоном» в профессиональной разработке, так как сохраняет единство интерфейса.
Рассмотрим вторую часть задачи: как быстро внести товары из сторонних файлов. Выясним, какие инструменты предоставляет платформа 1С для каждого формата.
1. Загрузка из Excel (XLSX, XLS)
Если данные представлены в виде таблицы Excel, у нас есть два пути. Первый — использование объекта ЧтениеXLSX. Это «родной» механизм платформы 8.3, который работает на сервере без необходимости устанавливать Microsoft Excel на компьютер. Разберем логику:
ЧтениеТаблицы = Новый ЧтениеXLSX;
ЧтениеТаблицы.Открыть(ПутьКФайлу);
Поток = ЧтениеТаблицы.ВыбратьЛист(1);
Пока Поток.Прочитать() Цикл
// Читаем данные из колонок
Наименование = Поток.Получить(1);
Цена = Поток.Получить(2);
// Ищем товар в справочнике и добавляем в ТЧ
КонецЦикла;
Второй путь — загрузка из буфера обмена. В типовых конфигурациях для этого предусмотрена кнопка «Загрузить из файла» над табличной частью. Пользователь просто копирует строки в Excel и вставляет их в специальное окно 1С, где программа сама сопоставляет колонки по названиям.
2. Загрузка из XML
Это наиболее надежный способ обмена данными. Для работы используем объект ЧтениеXML. Проанализируем структуру: если файл XML структурирован (например, содержит узлы <Item> с атрибутами Name и Price), мы можем программно разобрать его за доли секунды. Главное преимущество XML — отсутствие проблем с форматами дат и чисел, которые часто возникают в Excel.
3. Загрузка из PDF
Ситуация с PDF самая сложная. Посмотрим на возможные варианты решения:
Проанализировав методы загрузки, важно выделить главную проблему — идентификацию номенклатуры. Никогда не полагайтесь только на наименование, так как лишний пробел или кавычка в файле Excel приведут к тому, что 1С не найдет товар. Рассмотрим иерархию надежности поиска:
СокрЛП() и приведением к единому регистру.Таким образом, комбинируя методы работы с выделенными строками и современные средства чтения файлов, можно значительно ускорить работу пользователей и минимизировать ошибки ручного ввода.