Предпосылки появления данного материала
Данная публикация появилась потому, что на текущий момент времени мне приходится работать исключительно с конфигурацией 1С:Управление торговлей 11.5 (УТ 11.5). Для экономии собственного времени я решил провести дополнительный анализ новых (и хорошо забытых старых) встроенных возможностей данной конфигурации по работе с табличными частями.
Функционал описания не будет касаться БСП, а исключительно общих модулей УТ 11.5. Для публикации примеров и разработки я выбрал самую свежайшую версию на март 2025 г - это 1С:Управление торговлей 11.5.21.106. на платформе 1С:Предприятие 8.3.26.1498.
Вероятно, что часть данного функционала известна широким массам, но размещаю его как "шпаргалку" для всех - в том числе и я себя, конечно!
В данном обзоре затронем некоторые возможности функционала с табличными частями - такими как "встроенная работа буфера обмена с табличными частями", "разбиение выделенных строк по количеству" и "кэширование строк в табличных частях".
Считаю, что работа с буфером обмена в рамках платформы 1с - одна из интересных методик, позволяющая существенно сократить листинг кода и время на его разработку.
1. Встроенная работа с табличными частями и буфером обмена
Для примера предлагается совершенно простейшая форма обработки с табличной частью, с которой мы будем работать:
Рис.1. Обработка с произвольной табличной частью, над которой будем ставить эксперименты.
Копирование в буфер обмена выделенные строки табличной части СкопироватьСтрокиВБуферОбмена код выглядит вот так:
// === Скопировать в буфер обмена выделенные строки ===
&НаКлиенте
Процедура СкопироватьВБуферОбмена(Команда)
МассивСтрок = Элементы.ТабличнаяЧасть1.ВыделенныеСтроки;
СкопироватьВБуферСервером(МассивСтрок);
КонецПроцедуры
&НаСервере
Процедура СкопироватьВБуферСервером(ВыдСтр)
РаботаСТабличнымиЧастями.СкопироватьСтрокиВБуферОбмена(Объект.ТабличнаяЧасть1,ВыдСтр);
КонецПроцедуры
Проверка, есть ли что в буфере обмена ЕстьСтрокиВБуфереОбмена():
// === Проверить есть ли что в буфере ===
&НаКлиенте
Процедура ЕстьЛиВБуфере(Команда)
Сообщить(ПроверитьБуферОбменаСервером());
КонецПроцедуры
&НаСервере
Функция ПроверитьБуферОбменаСервером()
Возврат РаботаСТабличнымиЧастями.ЕстьСтрокиВБуфереОбмена();
КонецФункции
Получение таблицы значений из буфера обмена СтрокиИзБуфераОбмена с заданными параметрами отбора по значению и именам колонок:
// ====== Получить из буфера по отбору ===
&НаКлиенте
Процедура ВставитьИЗБуфера(Команда)
ПолучитьСтрокиИЗБуфераСервером();
КонецПроцедуры
&НаСервере
Процедура ПолучитьСтрокиИЗБуфераСервером()
// массив, колонок, который нужен для новой таблицы из буфера
МассивКолонок = Новый Массив();
МассивКолонок.Добавить("Номенклатура");
МассивКолонок.Добавить("Количество");
// отбирам по соответствию
ПараметрыОтбора = Новый Соответствие();
ПараметрыОтбора.Вставить("Количество", 300);
// Вернем таблицу значения (ошибка будет если передать на клиент возвратом)
ААА = РаботаСТабличнымиЧастями.СтрокиИзБуфераОбмена(ПараметрыОтбора, МассивКолонок);
КонецПроцедуры
Копирование в буфер обмена табличной части целиком выглядит вот так:
// ===== Копируем таблицу в буфер полностью
&НаКлиенте
Процедура СкопироватьТаблицуВБуфер(Команда)
СкопироватьТаблицуВБуферПолностью();
КонецПроцедуры
&НаСервере
Процедура СкопироватьТаблицуВБуферПолностью()
ТЗ=Объект.ТабличнаяЧасть1.Выгрузить();
РаботаСТабличнымиЧастями.ПоместитьТаблицуЗначенийВБуферОбмена(ТЗ);
КонецПроцедуры
Так, теперь перейдем к следующему разделу:
2. Разбиение строк в табличной части, о котором вы, вероятно, не знали.
Попробуем разбить выделенную строку по количеству в табличной части на форме, код выглядит вот так:
// конструктор для разбиения строки
Функция ПараметрыРазбиенияСтроки() Экспорт
ПараметрыРазбиенияСтроки = Новый Структура;
ПараметрыРазбиенияСтроки.Вставить("ИмяПоляКоличество", "КоличествоУпаковок");
ПараметрыРазбиенияСтроки.Вставить("Заголовок", НСтр("ru = 'Введите количество товара в новой строке'"));
ПараметрыРазбиенияСтроки.Вставить("РазрешитьНулевоеКоличество", Истина);
ПараметрыРазбиенияСтроки.Вставить("Количество", Неопределено);
ПараметрыРазбиенияСтроки.Вставить("МаксимальноДопустимоеЗначение", 0);
Возврат ПараметрыРазбиенияСтроки;
КонецФункции
&НаКлиенте
Процедура РазбитьСтрокуПоКоличеству(Команда)
Разбить = РаботаСТабличнымиЧастямиКлиент.ПараметрыРазбиенияСтроки();
Разбить.ИмяПоляКоличество = "Количество";
Разбить.Количество = 15;
РаботаСТабличнымиЧастямиКлиент.РазбитьСтроку(Объект.ТабличнаяЧасть1,Элементы.ТабличнаяЧасть1,,Разбить)
КонецПроцедуры
а на деле работает это вот так:
Рис.2. Разбиение выделенной строки по количеству.
Кому интересно, данный функционал разбиения представляет собой следующий код (в принципе можно доработать так, чтобы аналог алгоритма разбивал "номенклатуры" на состав, серии и т.п... - в "самописках") :
Процедура ДобавитьСтрокуРазбиением(ТЧ, ЭлементФормы, Количество, ОповещениеПослеРазбиения, ПараметрыРазбиенияСтроки)
ТекущаяСтрока = ЭлементФормы.ТекущиеДанные;
НоваяСтрока = ТЧ.Вставить(ТЧ.Индекс(ТекущаяСтрока) + 1);
ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекущаяСтрока);
НоваяСтрока[ПараметрыРазбиенияСтроки.ИмяПоляКоличество] = Количество;
ТекущаяСтрока[ПараметрыРазбиенияСтроки.ИмяПоляКоличество] =
ТекущаяСтрока[ПараметрыРазбиенияСтроки.ИмяПоляКоличество] - Количество;
Если ОповещениеПослеРазбиения <> Неопределено Тогда
ВыполнитьОбработкуОповещения(ОповещениеПослеРазбиения, НоваяСтрока);
КонецЕсли;
ЭлементФормы.ТекущаяСтрока = НоваяСтрока.ПолучитьИдентификатор();
КонецПроцедуры
Процедура ВвестиКоличествоДляРазбиения(ПараметрыОбработки) Экспорт
ПараметрыРазбиенияСтроки = ПараметрыОбработки.ПараметрыРазбиенияСтроки;
Если ПараметрыРазбиенияСтроки.Количество = Неопределено Тогда
Количество = ПараметрыОбработки.ЭлементФормы.ТекущиеДанные[ПараметрыРазбиенияСтроки.ИмяПоляКоличество];
Иначе
Количество = ПараметрыРазбиенияСтроки.Количество;
КонецЕсли;
Оповещение = Новый ОписаниеОповещения("ВвестиКоличествоДляРазбиенияПослеВвода", ЭтотОбъект, ПараметрыОбработки);
ПоказатьВводЧисла(Оповещение, Количество, ПараметрыРазбиенияСтроки.Заголовок, 15, 3);
КонецПроцедуры
Процедура ВвестиКоличествоДляРазбиенияПослеВвода(Количество, ПараметрыОбработки) Экспорт
ОповещениеПослеРазбиения = ПараметрыОбработки.ОповещениеПослеРазбиения;
Если Количество = Неопределено Тогда
Если ОповещениеПослеРазбиения <> Неопределено Тогда
ВыполнитьОбработкуОповещения(ОповещениеПослеРазбиения, Неопределено);
КонецЕсли;
Возврат;
КонецЕсли;
ПараметрыРазбиенияСтроки = ПараметрыОбработки.ПараметрыРазбиенияСтроки;
ТекущееКоличество = ПараметрыОбработки.ЭлементФормы.ТекущиеДанные[ПараметрыРазбиенияСтроки.ИмяПоляКоличество];
ТекстСообщения = Неопределено;
Если Количество = 0 И Не ПараметрыРазбиенияСтроки.РазрешитьНулевоеКоличество Тогда
ТекстСообщения = НСтр("ru = 'Количество в новой строке не может быть равно нулю.'");
ИначеЕсли Количество = ТекущееКоличество И Не ПараметрыРазбиенияСтроки.РазрешитьНулевоеКоличество Тогда
ТекстСообщения = НСтр("ru = 'Количество в новой строке должно отличаться от количества в текущей.'");
ИначеЕсли Количество < 0 И ТекущееКоличество >= 0 Тогда
ТекстСообщения = НСтр("ru = 'Количество в новой строке не может быть отрицательным.'");
ИначеЕсли Количество > 0 И ТекущееКоличество <= 0 Тогда
ТекстСообщения = НСтр("ru = 'Количество в новой строке не может быть положительным.'");
ИначеЕсли Количество > ТекущееКоличество И ТекущееКоличество >= 0 Тогда
ТекстСообщения = НСтр("ru = 'Количество в новой строке не может быть больше количества в текущей.'");
ИначеЕсли Количество < ТекущееКоличество И ТекущееКоличество <= 0 Тогда
ТекстСообщения = НСтр("ru = 'Количество в новой строке не может быть меньше количества в текущей.'");
ИначеЕсли ПараметрыРазбиенияСтроки.МаксимальноДопустимоеЗначение <> 0
И Количество > ПараметрыРазбиенияСтроки.МаксимальноДопустимоеЗначение Тогда
ТекстСообщения = НСтр("ru = 'Количество в новой строке не должно превышать %1.'");
ТекстСообщения = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
ТекстСообщения, ПараметрыРазбиенияСтроки.МаксимальноДопустимоеЗначение);
КонецЕсли;
Если ЗначениеЗаполнено(ТекстСообщения) Тогда
Оповещение = Новый ОписаниеОповещения("ВвестиКоличествоДляРазбиения", ЭтотОбъект, ПараметрыОбработки);
ПоказатьПредупреждение(Оповещение, ТекстСообщения);
Иначе
ДобавитьСтрокуРазбиением(ПараметрыОбработки.ТабличнаяЧасть, ПараметрыОбработки.ЭлементФормы,
Количество, ОповещениеПослеРазбиения, ПараметрыРазбиенияСтроки);
КонецЕсли;
КонецПроцедуры
Далее, посмотрим еще кое-какие возможности.
3. Кэширование строк табличной части
Данный метод работает через инициализацию реквизита формы "КэшированныеСтроки" произвольного типа. Код работы с кэшированием выглядит вот так:
&НаСервере
Процедура ПриОткрытииНаСервере()
// Инициализируем кэш строк для выбранной таблицы, нужен произвольный реквизит КэшированныеСтроки
РаботаСТабличнымиЧастями.ИнициализироватьКэшСтрок(Элементы.ТабличнаяЧасть1);
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
ПриОткрытииНаСервере();
КонецПроцедуры
&НаКлиенте
Процедура ТекущаяСтрокаВКэд(Команда)
РаботаСТабличнымиЧастямиКлиент.КэшироватьТекущуюСтроку(Элементы.ТабличнаяЧасть1,ЭтаФорма);
КонецПроцедуры
&НаКлиенте
Процедура СтрокуИзКеша(Команда)
ФиксСтруктура =РаботаСТабличнымиЧастямиКлиентСервер.КэшСтроки(Элементы.ТабличнаяЧасть1, ЭтаФорма);
КонецПроцедуры
Пожалуй, теперь перейдем к заключению и сделаем некоторые выводы.
Заключение и выводы
Представленный материал не претендует на какую-то новинку, его цель - упорядочить знания о возможностях типового функционала конфигурации 1С:Управление торговлей 11.5. Здесь, мы ознакомились с работой буфера по табличным частям, возможностям разбиения строк по количеству, которые уже заложены, а так же подход по кэшированию выделенных строки табличных частей.
Спасибо, что дочитали данный материал до конца, надеюсь, что многим он будет полезен.
Вы можете ознакомиться с другими разработками автора по профилю, ссылкам в этой статье и телеграмм канале.
Кроме того, отмечу, что у автора есть много практических обработок для работы с торговым оборудованием как через типовые библиотеки подключаемого оборудования разных версий (старых и новейших), так и "самописки" с урезанными пакетами драйверов, что сокращает объемы исходников в десятки раз! И это только часть представлена в этом профиле.
Другие разработки и статьи автора
Вы можете так же ознакомиться с другими некоторые практическими материалами автора. Всем спасибо за внимание.
Бухгалтерские отчеты-сборки:
Сборка доходов и расходов по счетам хозрасчетного плана для 1С:БП 3.0 (март 2025)
Отчет по основным средствам для Бухгалтерии 3.0
Классические обработки-примеры:
Классический корректный пример внешней печатной формы с печатью и подписями на БСП 3.1.10
Использование собственных макетов в СКД на примере УТ 11.5
Некоторые примеры обменов:
Служебная выгрузка-загрузка номенклатуры, штрихкодов, остатков, видов цен из 1С:Розницы в 1С:Розницу
Простой и быстрый перенос справочника "Номенклатура" из УТ 11.4 в Розницу 2.3
Некоторые примеры работы с торговым оборудованием:
Произвольная текстовая строка в кассовом чеке ККМ по стандарту БПО