При разработке обработок в 1С часто возникает задача реализации удобного механизма отбора данных. Один из распространённых сценариев — это отбор товаров по группам справочника номенклатуры. Эта задача усложняется, когда требуется обеспечить корректную работу и удобство использования на мобильных устройствах. В рамках данной статьи мы подробно рассмотрим, как реализовать такой отбор, а также разберём распространённую проблему с некорректным отображением форм при тестировании через мобильный браузер и выясним, как её исправить.
Перед нами стоит задача: на форме обработки должны быть отображены группы номенклатуры, чтобы пользователь мог выбрать одну или несколько групп для последующего отбора товаров. Изначально может показаться, что для мобильных устройств требуется особый подход, но на самом деле платформа 1С:Предприятие обеспечивает высокую степень адаптивности управляемых форм. Мы рассмотрим несколько эффективных способов реализации такого отбора, каждый из которых имеет свои преимущества и особенности для мобильных устройств.
Этот подход является наиболее простым и стандартным, а также хорошо адаптирован платформой для работы как на обычных, так и на мобильных устройствах. Давайте разберем его по шагам.
СправочникСсылка.Номенклатура. Это позволяет полю ссылаться на элементы или группы справочника "Номенклатура".ВыборГруппИЭлементов (или ВыбиратьГруппы в более старых версиях платформы) в значение Истина. Это свойство находится в палитре свойств элемента формы.При такой настройке, когда пользователь будет открывать форму выбора из данного поля, он сможет выбрать не только конкретный товар, но и любую группу номенклатуры. Платформа 1С автоматически сформирует удобный интерфейс для выбора, который будет оптимально выглядеть на мобильном устройстве.
Пример кода (в модуле формы обработки):
Допустим, у нас есть реквизит формы ВыбраннаяГруппа с типом СправочникСсылка.Номенклатура.
// При создании на сервере, если нужно установить начальное значение
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Пример: Установить заранее выбранную группу (если есть)
// ВыбраннаяГруппа = Справочники.Номенклатура.НайтиПоНаименованию("МояГруппа");
КонецПроцедуры
// В обработчике команды (например, кнопки "Сформировать отчет"),
// мы можем проверить, что было выбрано
&НаКлиенте
Процедура СформироватьОтчет(Команда)
Если НЕ ЗначениеЗаполнено(ВыбраннаяГруппа) Тогда
Сообщить("Пожалуйста, выберите группу или элемент номенклатуры.");
Возврат;
КонецЕсли;
Если ВыбраннаяГруппа.ЭтоГруппа Тогда
Сообщить("Выбрана группа: " + ВыбраннаяГруппа.Наименование + ". Выполняем отбор по группе.");
// Здесь будет логика для отбора товаров, входящих в эту группу
ВыполнитьОтборПоГруппеНаСервере(ВыбраннаяГруппа);
Иначе
Сообщить("Выбран элемент: " + ВыбраннаяГруппа.Наименование + ". Выполняем отбор по элементу.");
// Здесь будет логика для отбора по конкретному элементу
ВыполнитьОтборПоЭлементуНаСервере(ВыбраннаяГруппа);
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ВыполнитьОтборПоГруппеНаСервере(ГруппаНоменклатуры)
// Пример запроса для получения всех элементов, входящих в выбранную группу
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Номенклатура.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|ГДЕ
| Номенклатура.Родитель ИЕРАРХИЯ &ГруппаНоменклатуры";
Запрос.УстановитьПараметр("ГруппаНоменклатуры", ГруппаНоменклатуры);
РезультатЗапроса = Запрос.Выполнить();
Выборка = РезультатЗапроса.Выбрать();
Сообщить("Найдены следующие элементы в группе " + ГруппаНоменклатуры.Наименование + ":");
Пока Выборка.Следующий() Цикл
Сообщить(" - " + Выборка.Ссылка);
КонецЦикла;
// Здесь может быть дальнейшая обработка полученных данных
КонецПроцедуры
&НаСервере
Процедура ВыполнитьОтборПоЭлементуНаСервере(ЭлементНоменклатуры)
Сообщить("Обработка для элемента " + ЭлементНоменклатуры.Наименование + ".");
// Здесь может быть дальнейшая обработка для одного элемента
КонецПроцедуры
Особенности для мобильных устройств: Стандартные формы выбора справочников в 1С уже оптимизированы для сенсорного ввода и небольших экранов. Пользователь сможет легко пролистывать и выбирать группы.
Если нам требуется более сложное представление или возможность множественного выбора групп непосредственно на форме, то мы можем прибегнуть к динамическому списку. Этот подход дает нам большую гибкость в отображении данных.
ТаблицаФормы).Справочник.Номенклатура.Просмотр динамического списка в значение Иерархический список и свойство РежимПросмотра в Иерархический.Таким образом, пользователь сможет видеть иерархию групп номенклатуры прямо на форме, раскрывать их и выбирать нужные. Для реализации выбора только групп, а не элементов, потребуется дополнительная логика в обработчике выбора элемента списка. Например, мы можем использовать свойство ЭтоГруппа у выбранного элемента.
Особенности для мобильных устройств: Иерархические списки в 1С также неплохо отображаются на мобильных устройствах. Однако для достижения наилучшего пользовательского опыта, возможно, потребуется дополнительная настройка ширины колонок и размера шрифта, чтобы информация не выглядела слишком мелко или не выходила за границы экрана.
Пример кода (в модуле формы обработки):
Допустим, у нас есть элемент формы ТаблицаГруппНоменклатуры, связанный с динамическим списком. Мы хотим получать выбранные группы.
// В обработчике события "ПриАктивизацииСтроки" или "ПриИзменении" для динамического списка
&НаКлиенте
Процедура ТаблицаГруппНоменклатурыПриАктивизацииСтроки(Элемент)
ТекущиеДанные = Элементы.ТаблицаГруппНоменклатуры.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
Если ТекущиеДанные.Ссылка.ЭтоГруппа Тогда
Сообщить("Выбрана группа: " + ТекущиеДанные.Ссылка.Наименование);
// Здесь можно сохранить выбранную группу или добавить ее в список выбранных
Иначе
Сообщить("Выбран элемент номенклатуры: " + ТекущиеДанные.Ссылка.Наименование);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Для множественного выбора может потребоваться добавление колонки с флажком
// и обработка ее изменения
&НаКлиенте
Процедура ТаблицаГруппНоменклатурыВыбор(Элемент, ВыбраннаяСтрока, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь; // Отменяем стандартную обработку, если хотим свою логику
Если ВыбраннаяСтрока <> Неопределено Тогда
Если ВыбраннаяСтрока.Ссылка.ЭтоГруппа Тогда
Сообщить("Выбрана группа: " + ВыбраннаяСтрока.Ссылка.Наименование);
// ... дальнейшая логика ...
Иначе
Сообщить("Выбран элемент: " + ВыбраннаяСтрока.Ссылка.Наименование);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Когда нам необходима максимальная гибкость в отображении и поведении, мы можем программно сформировать дерево значений. Этот подход требует больше кодирования, но позволяет создать уникальный пользовательский интерфейс.
ДеревоЗначений, который будет представлять иерархию групп номенклатуры. Мы можем добавлять в него колонки для хранения ссылки на группу, наименования, а также флажки для выбора.Особенности для мобильных устройств: Этот метод требует наибольших усилий для адаптации к мобильным устройствам. Стандартное отображение дерева может быть неудобным на маленьком экране. Возможно, потребуется ручная настройка стилей, размеров колонок и элементов управления, чтобы обеспечить комфортное взаимодействие с сенсорным экраном.
Пример кода (в модуле формы обработки):
Создадим реквизит формы ДеревоГрупп с типом ДеревоЗначений и заполним его.
Перем ДеревоГрупп; // Описание реквизита формы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЗагрузитьДеревоГрупп();
КонецПроцедуры
&НаСервере
Процедура ЗагрузитьДеревоГрупп()
ДеревоГрупп = Новый ДеревоЗначений;
ДеревоГрупп.Колонки.Добавить("Ссылка", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"));
ДеревоГрупп.Колонки.Добавить("Наименование");
ДеревоГрупп.Колонки.Добавить("Выбрано", Новый ОписаниеТипов("Булево"));
ЗаполнитьДеревоЗначений(ДеревоГрупп, Справочники.Номенклатура.ПустаяСсылка(), 0);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьДеревоЗначений(РодительскоеДерево, Родитель, Уровень)
Выборка = Справочники.Номенклатура.ВыбратьИерархически(Родитель);
Пока Выборка.Следующий() Цикл
Если Выборка.ЭтоГруппа Тогда
НоваяСтрока = РодительскоеДерево.Строки.Добавить();
НоваяСтрока.Ссылка = Выборка.Ссылка;
НоваяСтрока.Наименование = Выборка.Наименование;
НоваяСтрока.Выбрано = Ложь; // По умолчанию не выбрано
ЗаполнитьДеревоЗначений(НоваяСтрока.Строки, Выборка.Ссылка, Уровень + 1);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Для элемента формы "Таблица" с видом "Дерево", привязанного к реквизиту формы "ДеревоГрупп"
// Добавьте колонку "Выбрано" с видом "ПолеВыбора" и типом "Флажок"
&НаКлиенте
Процедура ДеревоГруппВыбраноПриИзменении(Элемент)
Если Элементы.ДеревоГрупп.ТекущиеДанные <> Неопределено Тогда
ТекущаяСтрока = Элементы.ДеревоГрупп.ТекущиеДанные;
Сообщить("Группа " + ТекущаяСтрока.Наименование + " "
+ ?(ТекущаяСтрока.Выбрано, "выбрана", "снята с выбора"));
// Здесь можно обновить список выбранных групп
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ПолучитьВыбранныеГруппы(Команда)
СписокВыбранныхГрупп = Новый СписокЗначений;
ПолучитьВыбранныеГруппыИзДерева(ДеревоГрупп, СписокВыбранныхГрупп);
Если СписокВыбранныхГрупп.Количество() > 0 Тогда
Сообщить("Выбраны следующие группы:");
Для Каждого Группа Из СписокВыбранныхГрупп Цикл
Сообщить(" - " + Группа.Представление);
КонецЦикла;
Иначе
Сообщить("Ничего не выбрано.");
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПолучитьВыбранныеГруппыИзДерева(Дерево, Список)
Для Каждого СтрокаДерева Из Дерево.Строки Цикл
Если СтрокаДерева.Выбрано Тогда
Список.Добавить(СтрокаДерева.Ссылка, СтрокаДерева.Наименование);
КонецЕсли;
Если СтрокаДерева.Строки.Количество() > 0 Тогда
ПолучитьВыбранныеГруппыИзДерева(СтрокаДерева.Строки, Список);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Для более сложных сценариев, когда требуется предоставить пользователям возможность самостоятельно настраивать произвольные отборы (не только по группам), можно использовать стандартную функциональность 1С, такую как "ПанельОтбора" или "УниверсальныйПодборИНастройкаОбъектов". Эти механизмы позволяют добавлять и изменять поля отбора, группировки и сортировки непосредственно в пользовательском режиме. Однако для простой задачи выбора одной или нескольких групп номенклатуры этот подход может быть избыточен и сложнее в освоении для конечного пользователя.
Особенности для мобильных устройств: "ПанельОтбора" как самостоятельный элемент не всегда оптимально отображается на маленьких экранах из-за большого количества настроек. Она больше подходит для десктопных версий приложений или планшетов с большим разрешением.
Мы подошли к следующей важной проблеме: как проверить форму для телефона, если при доступе через мобильный браузер она отображается как для компьютера? Это распространенная ситуация, которая часто вводит в заблуждение разработчиков. Выясним причину и рассмотрим способы корректного тестирования.
Самый надежный и рекомендуемый способ работы 1С на мобильных устройствах — это использование специализированного приложения "Мобильный клиент 1С:Предприятие". Это приложение, разработанное фирмой "1С", которое устанавливается на мобильное устройство (доступно для Android и iOS) и подключается к опубликованной на веб-сервере базе 1С. Мобильный клиент гарантирует корректное отображение форм, оптимизированных для мобильных устройств, поскольку он разработан специально для этой цели. Он правильно интерпретирует метаданные управляемых форм и отображает их с учетом особенностей сенсорного ввода, размеров шрифтов и расположения элементов на небольших экранах.
Мы рекомендуем использовать именно мобильный клиент для тестирования мобильных форм.
При публикации информационной базы на веб-сервере для работы с мобильным клиентом 1С необходимо убедиться, что в настройках публикации (например, в оснастке IIS или другом используемом веб-сервере) указаны соответствующие параметры, разрешающие подключение мобильных клиентов. Обычно, если база публикуется через стандартную утилиту публикации 1С, необходимые параметры устанавливаются автоматически.
Мы должны проверить, что наша база доступна через веб-сервер и что мобильный клиент может к ней подключиться. URL для мобильного клиента обычно совпадает с URL веб-клиента.
Проблема, когда мобильный браузер отображает форму как для ПК, часто связана с тем, что мобильные веб-браузеры могут по умолчанию отправлять заголовок User-Agent, имитирующий настольный браузер. Это особенно актуально, если сайт не оптимизирован или сам браузер имеет такую настройку. Платформа 1С:Предприятие при работе через веб-клиент определяет тип устройства на основе информации, передаваемой в заголовке User-Agent. Если браузер "маскируется" под настольный, 1С будет отображать настольную версию интерфейса.
Что нам следует проверить на телефоне: В большинстве мобильных браузеров есть опция "Версия для ПК" или "Полноценная версия сайта". Мы должны убедиться, что эта опция отключена. Если она активна, браузер будет запрашивать десктопную версию сайта, и 1С, соответственно, будет отдавать десктопный интерфейс.
В конфигураторе 1С:Предприятия для отдельных форм можно устанавливать свойство РежимОтображения (или ОсновнойРежимОтображения для управляемых форм). Это свойство может принимать значения, такие как МобильныйКлиент или ВебКлиент. Однако это чаще относится к специфическим режимам, когда мы хотим принудительно задать поведение формы для конкретного типа клиента, а не к автоматическому определению типа устройства. Основное влияние на адаптивное отображение все же оказывает сам мобильный клиент 1С, который знает, как правильно отрисовать форму, а также корректное определение типа клиента веб-сервером и платформой.
Если мы *обязательно* хотим тестировать через мобильный браузер, а не через мобильный клиент, и сталкиваемся с отображением для ПК, то это может быть ограничением конкретного мобильного браузера или особенностями конфигурации веб-сервера. Платформа 1С определяет режим работы (мобильный/десктопный) при старте веб-клиента. Если определение произошло как десктопный, интерфейс будет соответствующим.
В некоторых случаях, для принудительного отображения мобильного интерфейса через браузер, может потребоваться явное указание в URL параметра или соответствующая настройка веб-сервера, которая принудительно укажет, что клиент является мобильным. Однако этот путь менее стандартен и часто сопряжен с дополнительными трудностями и потенциальными ошибками отображения по сравнению с использованием официального Мобильного клиента 1С.
Мы настоятельно рекомендуем использовать Мобильный клиент 1С для полноценного и корректного тестирования форм на мобильных устройствах, так как это является основным и наиболее надежным способом работы с мобильной функциональностью 1С:Предприятия.