Как внести данные в 1С через макет и защитить шаблоны Excel от изменений пользователей?

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

Каждый разработчик 1С рано или поздно сталкивается с ситуацией, когда бизнес-процессы компании завязаны на заполнении разнообразных таблиц в Microsoft Excel. Пользователи привыкли к свободе табличного редактора: возможности быстро копировать строки, объединять ячейки, использовать формулы и визуальное оформление. Однако для учетной системы ручной ввод данных из сотен разнородных файлов Excel превращается в настоящий кошмар. Столбцы постоянно сдвигаются, форматы дат и чисел нарушаются, а справочные данные вводятся с опечатками.

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

Способ 1. Создание интерактивной Excel-подобной формы на базе Табличного документа

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

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

  1. ТолькоПросмотр (Read-only) — устанавливается для всего табличного документа в значение Истина. Это базовый уровень защиты, предотвращающий случайное удаление строк, столбцов или изменение фиксированных текстовых заголовков макета.
  2. Редактирование (Edit) — устанавливается для всего табличного документа в значение Истина. Это свойство позволяет пользователю активировать режим редактирования в тех ячейках, которые мы явно откроем для ввода данных.
  3. Защита (Protection) — управляется точечно на уровне конкретных областей или отдельных ячеек. По умолчанию у всех ячеек макета свойство Защита равно Истина. Чтобы разрешить ввод в конкретную ячейку, мы должны программно или интерактивно установить для нее Защита = Ложь.

Рассмотрим важный нюанс работы с буфером обмена (Ctrl+C / Ctrl+V). Если вы установите свойство Защита в значение Истина на уровне самого элемента формы (а не его ячеек), платформа полностью заблокирует возможность копирования данных. Чтобы ваши пользователи могли свободно копировать, например, артикулы товаров из внешних источников, но не могли изменять структуру вашего шаблона, обязательно оставляйте защиту отключенной на уровне самого объекта формы, регулируя доступность редактирования исключительно через свойства конкретных ячеек макета.

Давайте посмотрим на практический пример программной инициализации такого шаблона на сервере:


&НаСервере
Процедура ИнициализироватьШаблонВводаНаСервере()
    
    ТабДок = Объект.ТабличныйДокумент;
    ТабДок.Очистить();
    
    // Создаем фиксированную шапку таблицы, которую пользователь не сможет изменить
    ОбластьШапка = ТабДок.ПолучитьОбласть("R1C1:R1C3");
    ОбластьШапка.Область("R1C1").Текст = "Номенклатура (Выбор из базы)";
    ОбластьШапка.Область("R1C2").Текст = "Количество";
    ОбластьШапка.Область("R1C3").Текст = "Ожидаемая дата поставки";
    
    // Задаем визуальное оформление шапки
    ОбластьШапка.Область("R1C1:R1C3").Шрифт = Новый Шрифт(,,Истина);
    ОбластьШапка.Область("R1C1:R1C3").ЦветФона = WebЦвета.СветлоСерый;
    
    ТабДок.Вывести(ОбластьШапка);
    
    // Формируем строки для ввода данных пользователем
    Для ИндексСтроки = 2 По 15 Цикл
        
        // Настраиваем ячейку для выбора Номенклатуры
        ЯчейкаНоменклатура = ТабДок.Область(ИндексСтроки, 1);
        ЯчейкаНоменклатура.Защита = Ложь; // Разрешаем ввод
        
        // Настраиваем ячейку для ввода Количества
        ЯчейкаКоличество = ТабДок.Область(ИндексСтроки, 2);
        ЯчейкаКоличество.Защита = Ложь; // Разрешаем ввод
        
        // Настраиваем ячейку для ввода Даты
        ЯчейкаДата = ТабДок.Область(ИндексСтроки, 3);
        ЯчейкаДата.Защита = Ложь; // Разрешаем ввод
        
    КонецЦикла;
    
    // Применяем настройки защиты ко всему документу
    ТабДок.ТолькоПросмотр = Истина;
    ТабДок.Редактирование = Истина;
    
КонецПроцедуры

Способ 2. Типизация ячеек и умный интерактивный ввод данных

Одной из главных проблем ручного ввода в Excel является отсутствие жесткой типизации данных. Пользователь может написать "десять" вместо числа 10 или ввести дату в нечитаемом формате. Платформа 1С позволяет решить эту проблему изящно: мы можем сделать ячейки табличного документа строго типизированными. При активации такой ячейки пользователь увидит привычные элементы управления 1С (кнопку выбора из справочника, календарь или калькулятор).

Для этого используются свойства ячейки СодержитЗначение и ТипЗначения. Давайте модернизируем наш код инициализации макета и превратим обычные текстовые ячейки в интеллектуальные поля ввода:


&НаСервере
Процедура НастроитьТипизациюЯчеекНаСервере()
    
    ТабДок = Объект.ТабличныйДокумент;
    МаксимальнаяСтрока = ТабДок.ВысотаТаблицы;
    
    Для ИндексСтроки = 2 По МаксимальнаяСтрока Цикл
        
        // Устанавливаем строгую ссылку на справочник Номенклатура
        ЯчейкаНоменклатура = ТабДок.Область(ИндексСтроки, 1);
        ЯчейкаНоменклатура.СодержитЗначение = Истина;
        ЯчейкаНоменклатура.ТипЗначения = Новый ОписаниеТипов("СправочникСсылка.Номенклатура");
        
        // Устанавливаем числовой формат с ограничением разрядности
        ЯчейкаКоличество = ТабДок.Область(ИндексСтроки, 2);
        ЯчейкаКоличество.СодержитЗначение = Истина;
        КвалификаторыЧисла = Новый КвалификаторыЧисла(10, 3, ДопустимыйЗнак.Положительный);
        ЯчейкаКоличество.ТипЗначения = Новый ОписаниеТипов("Число", КвалификаторыЧисла);
        
        // Устанавливаем формат даты
        ЯчейкаДата = ТабДок.Область(ИндексСтроки, 3);
        ЯчейкаДата.СодержитЗначение = Истина;
        КвалификаторыДаты = Новый КвалификаторыДаты(ЧастиДаты.Дата);
        ЯчейкаДата.ТипЗначения = Новый ОписаниеТипов("Дата", , , КвалификаторыДаты);
        
    КонецЦикла;
    
КонецПроцедуры

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

Способ 3. Быстрое чтение заполненного макета без циклов с помощью Построителя запроса

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

Существует малоизвестный, но невероятно эффективный способ мгновенной выгрузки заполненных областей табличного документа в оперативную память. Мы можем использовать ПостроительЗапроса и его свойство ОписаниеИсточникаДанных. Этот механизм преобразует ячейки табличного документа в стандартную ТаблицуЗначений буквально за доли секунды.

Проанализируем пример функции быстрого импорта данных:


&НаСервере
Функция ВыгрузитьМакетВТаблицуЗначений() Экспорт
    
    ТабДок = Объект.ТабличныйДокумент;
    ВысотаТаблицы = ТабДок.ВысотаТаблицы;
    
    Если ВысотаТаблицы < 2 Тогда
        ВызватьИсключение "Таблица пуста или содержит только шапку!";
    КонецЕсли;
    
    // Выделяем область с данными (строки со 2 по последнюю заполненную, колонки с 1 по 3)
    ОбластьДанных = ТабДок.Область(2, 1, ВысотаТаблицы, 3);
    
    // Используем ПостроительЗапроса для высокоскоростной выгрузки в ТЗ
    Построитель = Новый ПостроительЗапроса;
    Построитель.ИсточникДанных = Новый ОписаниеИсточникаДанных(ОбластьДанных);
    
    Попытка
        ТаблицаДанных = Построитель.Результат.Выгрузить();
        Возврат ТаблицаДанных;
    Исключение
        ЗаписатьЛогСобытий("Ошибка конвертации макета: " + ОписаниеОшибки());
        ВызватьИсключение "Не удалось прочитать данные макета. Проверьте правильность заполнения ячеек.";
    КонецПопытки;
    
    Возврат Неопределено;
    
КонецФункции

Метод выгрузит заполненные строки в объект ТаблицаЗначений. Колонки полученной таблицы будут названы автоматически по именам колонок нашего табличного документа. Это избавляет разработчика от необходимости писать громоздкие парсеры и сопоставлять типы вручную.

Способ 4. Готовое решение на базе БСП «Загрузка данных из файла»

Если перед вами стоит задача регулярного импорта информации из внешних источников и вы не хотите тратить время на разработку собственного интерфейса валидации, обратите внимание на стандартную библиотеку 1С. В составе Библиотеки стандартных подсистем (БСП), которая лежит в основе конфигураций УТ, ERP, КА, УНФ и Бухгалтерия, присутствует готовый мощный инструмент — подсистема «Загрузка данных из файла».

Давайте разберем по шагам, как работает этот механизм для конечного пользователя:

  1. Получение шаблона. Пользователь нажимает кнопку импорта непосредственно в интерфейсе нужного справочника или документа. Система сама генерирует и выгружает на его компьютер эталонный файл Excel (.xlsx) с жестко заданной структурой колонок.
  2. Заполнение вне системы. Пользователь спокойно заполняет этот файл на своем рабочем месте. При этом он может использовать копирование и формулы, но порядок и названия ключевых колонок остаются неизменными.
  3. Импорт и валидация. Пользователь загружает файл обратно в 1С. Подсистема БСП автоматически анализирует структуру файла, сопоставляет текстовые названия номенклатуры или контрагентов с реальными ссылками в базе данных.
  4. Интерактивное исправление ошибок. Если в файле обнаружены ошибки (например, не найдена номенклатура по артикулу или не совпадает ИНН контрагента), система выведет удобное диалоговое окно. Ошибочные строки подсвечиваются красным цветом, и пользователь может исправить их прямо на экране 1С перед окончательной записью в базу.

Использование этого готового механизма БСП существенно экономит время разработки и обеспечивает надежную защиту базы от повреждения или засорения дублями.

Способ 5. Реализация сложных финансовых бюджетов (Архитектурный паттерн ERP)

В крупных учетных системах, таких как 1С:ERP Управление предприятием, разработчики пошли еще дальше. В подсистеме бюджетирования существует документ ЭкземплярБюджета, который полностью построен по принципу динамических интерактивных таблиц.

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

Изучение архитектуры документа ЭкземплярБюджета в ERP позволяет понять, что возможности платформы 1С по работе с табличными документами практически безграничны и способны полностью заменить хаотичные Excel-файлы красивым, управляемым и безопасным интерфейсом ввода данных.

← На главную