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

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

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

Исходная проблема и возможности платформы 1С

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

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

Использование механизма "Заполнение табличных частей" для интеграции обработки

Наиболее подходящий и рекомендуемый способ интегрировать внешнюю обработку для работы с табличной частью документа, такой как "Поступление товаров и услуг", без изменения конфигурации — это использование ее в качестве "Обработки для заполнения табличных частей объектов". Этот вид обработки специально разработан для таких задач и позволяет платформе 1С автоматически включать ее в соответствующее подменю формы.

  1. Регистрация внешней обработки в базе 1С.

    Первым шагом является регистрация вашей внешней обработки (.epf файл) в информационной базе 1С. Для этого перейдите в раздел "Администрирование" (или "Сервис" в старых интерфейсах) -> "Печатные формы, отчеты и обработки" -> "Дополнительные отчеты и обработки".

    1. Нажмите кнопку "Создать" или "Добавить", чтобы зарегистрировать новую обработку.
    2. Укажите путь к вашему файлу внешней обработки.
    3. Критически важно: В поле "Вид обработки" выберите значение "Заполнение табличных частей". Это ключевой момент, который позволит платформе правильно интерпретировать назначение вашей обработки.
    4. На вкладке "Назначение" необходимо привязать обработку к конкретным объектам и их табличным частям. Для нашего случая выберем:
      • Объект: Документ.ПоступлениеТоваровУслуг
      • Табличная часть: Товары (или другое имя вашей табличной части, с которой будет работать сканер).

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

  2. Реализация логики в модуле внешней обработки.

    Ваша внешняя обработка должна содержать экспортную процедуру с предопределенным именем, которую платформа 1С вызовет при запуске обработки из меню. Эта процедура называется Инициализировать.

    Синтаксис процедуры выглядит следующим образом:

    
    Процедура Инициализировать(Объект, ИмяТабличнойЧасти, ТабличноеПолеОбъекта) Экспорт
        // Объект - ссылка на текущий документ (например, ДокументОбъект.ПоступлениеТоваровУслуг)
        // ИмяТабличнойЧасти - строковое имя табличной части (например, "Товары")
        // ТабличноеПолеОбъекта - элемент управления "ТабличноеПоле", связанный с табличной частью
    
        Сообщить("Обработка запущена для документа " + Объект.Представление);
        Сообщить("Работаем с табличной частью " + ИмяТабличнойЧасти);
    
        // Здесь будет располагаться основная логика сканирования и заполнения
        // Для начала, мы можем получить саму табличную часть:
        ТабличнаяЧастьДокумента = Объект[ИмяТабличнойЧасти];
    
        // При необходимости, создаем и открываем форму для взаимодействия со сканером
        // и выполнения основной логики
        ФормаОбработки = ПолучитьФорму("Форма"); // Предполагается, что у обработки есть форма с именем "Форма"
        ФормаОбработки.ОбъектДокумента = Объект; // Передаем ссылку на документ в форму обработки
        ФормаОбработки.ИмяТабличнойЧасти = ИмяТабличнойЧасти;
        ФормаОбработки.ТабличноеПолеОбъекта = ТабличноеПолеОбъекта;
        ФормаОбработки.ОткрытьМодально(); // Или просто Открыть()
    
    КонецПроцедуры
    

    • Параметр Объект предоставляет нам доступ к текущему объекту документа (например, ДокументОбъект.ПоступлениеТоваровУслуг), с которым мы можем работать: читать и изменять его реквизиты, получать доступ к его табличным частям.
    • Параметр ИмяТабличнойЧасти — это строковое имя табличной части, для которой была вызвана обработка.
    • Параметр ТабличноеПолеОбъекта — это объект типа ТабличноеПоле, который представляет собой элемент формы, отображающий табличную часть. Он может быть полезен для управления фокусом или выделением в таблице, а также для обновления ее отображения.
  3. Реализация логики сканирования штрихкодов в форме обработки.

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

    1. Принцип работы сканера: Большинство сканеров штрихкодов подключаются как клавиатура (в режиме эмуляции ввода с клавиатуры). Это означает, что при считывании штрихкода он вводит его как текстовую строку, часто с добавлением специального префикса (например, F7 или другого символа) и символа перевода строки (Enter). Наша форма должна быть готова перехватывать этот ввод.
    2. Создание формы обработки: В вашей внешней обработке создайте новую форму. На этой форме можно разместить поле ввода для штрихкода (даже если оно невидимо, оно может служить для перехвата ввода), информационные поля (например, для отображения найденной номенклатуры) и, возможно, кнопки управления (например, "Очистить").
    3. Обработка событий ввода: Для перехвата штрихкодов в обычных формах можно использовать несколько подходов:
      • Поле ввода на форме: Разместите на форме текстовое поле и привяжите к его событию ПриИзменении процедуру, которая будет обрабатывать введенный штрихкод. После обработки штрихкод из поля следует очищать.
      • Общая обработка ввода формы: Для более продвинутых сценариев, когда штрихкод должен обрабатываться независимо от активного поля, можно использовать событие формы ОбработкаВвода (для обычных форм оно срабатывает при нажатии на клавиши, если нет активного элемента). Также можно использовать глобальные перехватчики событий клавиатуры, но это более сложный подход. В случае сканирования, эмулирующего клавиатуру, часто достаточно просто держать фокус на скрытом поле ввода и обрабатывать его ПриИзменении.
    4. Алгоритм обработки штрихкода:
      • При получении штрихкода (например, из текстового поля или напрямую из события ввода), выполните поиск номенклатуры по этому штрихкоду в базе данных 1С. Для этого может потребоваться специализированная функция, ищущая по регистру сведений Штрихкоды или по свойству Штрихкод в справочнике Номенклатура.
      • Если номенклатура найдена, проверьте, существует ли уже такая позиция в табличной части документа, которая была передана в форму обработки.
      • Если позиция существует, увеличьте количество товара в соответствующей строке.
      • Если позиция не найдена, добавьте новую строку в табличную часть документа, заполните поля Номенклатура, Количество (обычно 1), ЕдиницаИзмерения, Цена (если применимо) и другие необходимые реквизиты.
      • Важно: Обязательно вызовите метод Модифицирован() для объекта документа (ОбъектДокумента.Модифицирован = Истина;), чтобы система знала о внесенных изменениях и предложила сохранить документ при закрытии.
      • Также необходимо обновить отображение табличной части на форме документа. В обычных формах это может потребовать вызова метода ОбновитьОтображение() для элемента ТабличноеПолеОбъекта или принудительного обновления формы документа.

    Рассмотрим пример упрощенного фрагмента кода для обработки штрихкода в форме внешней обработки. Этот код будет находиться в модуле формы обработки.

    
    // Переменные формы, которые будут инициализированы из процедуры Инициализировать
    Перем ОбъектДокумента Экспорт;
    Перем ИмяТабличнойЧасти Экспорт;
    Перем ТабличноеПолеОбъекта Экспорт; // Элемент ТабличноеПоле с формы документа
    
    // Предполагается, что на форме есть элемент "ПолеВводаШтрихКода"
    // с типом "Поле ввода" и привязанной к нему переменной "ШтрихКодВвод".
    
    Процедура ПолеВводаШтрихКодаПриИзменении(Элемент)
        Если ПустаяСтрока(ШтрихКодВвод) Тогда
            Возврат;
        КонецЕсли;
    
        // Сохраняем штрихкод для обработки
        ПереданныйШК = ШтрихКодВвод;
    
        // Очищаем поле для следующего сканирования
        ШтрихКодВвод = "";
        ЭлементыФормы.ПолеВводаШтрихКода.Очистить(); // Очищаем и отображение
    
        Сообщить("Сканирован штрихкод: " + ПереданныйШК);
    
        // Поиск номенклатуры по штрихкоду
        // В реальной системе функция должна быть более сложной,
        // учитывая регистр сведений "Штрихкоды" и характеристики.
        НоменклатураНайдена = НайтиНоменклатуруПоШтрихкоду(ПереданныйШК); 
    
        Если НоменклатураНайдена = Неопределено Тогда
            Сообщить("Номенклатура по штрихкоду '" + ПереданныйШК + "' не найдена!");
            Возврат;
        КонецЕсли;
    
        // Получаем табличную часть, с которой работаем
        Если ОбъектДокумента = Неопределено Тогда
            Сообщить("Ошибка: ОбъектДокумента не инициализирован.");
            Возврат;
        КонецЕсли;
    
        ТабличнаяЧастьДокумента = ОбъектДокумента[ИмяТабличнойЧасти];
    
        // Ищем существующую строку с этой номенклатурой
        СтрокаТабличнойЧасти = Неопределено;
        Для Каждого СтрокаТЧ Из ТабличнаяЧастьДокумента Цикл
            Если СтрокаТЧ.Номенклатура = НоменклатураНайдена Тогда
                СтрокаТабличнойЧасти = СтрокаТЧ;
                Прервать;
            КонецЕсли;
        КонецЦикла;
    
        Если СтрокаТабличнойЧасти = Неопределено Тогда
            // Добавляем новую строку
            НоваяСтрока = ТабличнаяЧастьДокумента.Добавить();
            НоваяСтрока.Номенклатура = НоменклатураНайдена;
            НоваяСтрока.Количество = 1;
            // Дополнительно заполняем другие реквизиты, например, цену, единицу измерения
            ЗаполнитьРеквизитыНовойСтроки(НоваяСтрока, НоменклатураНайдена); // Вспомогательная процедура
        Иначе
            // Увеличиваем количество в существующей строке
            СтрокаТабличнойЧасти.Количество = СтрокаТабличнойЧасти.Количество + 1;
        КонецЕсли;
    
        // Оповещаем систему об изменении документа
        ОбъектДокумента.Модифицирован = Истина;
        Сообщить("Добавлена/увеличена позиция: " + НоменклатураНайдена.Наименование);
    
        // Обновляем отображение табличной части на форме документа
        Если ТабличноеПолеОбъекта <> Неопределено Тогда
            ТабличноеПолеОбъекта.Обновить();
        КонецЕсли;
    
        // Устанавливаем фокус обратно на поле ввода штрихкода для следующего сканирования
        ЭлементыФормы.ПолеВводаШтрихКода.УстановитьФокус();
    
    КонецПроцедуры
    
    // Вспомогательная функция для поиска номенклатуры по штрихкоду
    // Необходимо доработать под структуру конфигурации
    Функция НайтиНоменклатуруПоШтрихкоду(ШК)
        РезультатПоиска = Неопределено;
    
        // Примеры поиска:
        // 1. По свойству "Штрихкод" непосредственно в справочнике Номенклатура (если такое есть)
        // РезультатПоиска = Справочники.Номенклатура.НайтиПоРеквизиту("Штрихкод", ШК);
    
        // 2. По регистру сведений "Штрихкоды" (наиболее распространенный вариант)
        Запрос = Новый Запрос;
        Запрос.Текст = 
            "ВЫБРАТЬ ПЕРВЫЕ 1
            |    Штрихкоды.Номенклатура
            |ИЗ
            |    РегистрСведений.Штрихкоды КАК Штрихкоды
            |ГДЕ
            |    Штрихкоды.Штрихкод = &Штрихкод";
        Запрос.УстановитьПараметр("Штрихкод", ШК);
                
        Выборка = Запрос.Выполнить().Выбрать();
        Если Выборка.Следующий() Тогда
            РезультатПоиска = Выборка.Номенклатура;
        КонецЕсли;
    
        Возврат РезультатПоиска;
    КонецФункции
    
    // Вспомогательная процедура для заполнения других реквизитов новой строки
    Процедура ЗаполнитьРеквизитыНовойСтроки(НоваяСтрока, Номенклатура)
        // Например, установка стандартной единицы измерения, получение цены и т.д.
        // НоваяСтрока.ЕдиницаИзмерения = Номенклатура.ЕдиницаХраненияОстатков;
        // НоваяСтрока.Цена = ПолучитьЦенуНоменклатуры(Номенклатура);
        // ...
    КонецПроцедуры
    
    // Обработчик события ПриОткрытии формы
    Процедура ПриОткрытии()
        Если ТабличноеПолеОбъекта <> Неопределено Тогда
            // Возможно, нужно установить фокус на поле ввода штрихкода при открытии
            ЭлементыФормы.ПолеВводаШтрихКода.УстановитьФокус();
        КонецЕсли;
    КонецПроцедуры
    
  4. Особенности работы в обычных формах.

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

Дополнительные рекомендации

Для обеспечения надежности и удобства работы с внешней обработкой, рекомендуем учитывать следующие моменты:

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

← На главную