Типовая работа с табличными частями УТ 11.5, аналог которой программист каждый раз изобретает сам

24.03.25

Разработка - Механизмы типовых конфигураций

Рассмотрен ряд типовых возможностей по работе с табличным частями УТ 11.5, о которых стоит знать, а не изобретать свои.

Предпосылки появления данного материала

Данная публикация появилась потому, что на текущий момент времени мне приходится работать исключительно с конфигурацией 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С:Розницу

Технический перенос "Номенклатуры" (с указанием новых ставок НДС) и "Контрагентов" из УТ 10.3 в УТ 11.5

Простой и быстрый перенос справочника "Номенклатура" из УТ 11.4 в Розницу 2.3

 

Некоторые примеры работы с торговым оборудованием:

Произвольная текстовая строка в кассовом чеке ККМ по стандарту БПО

Работа с эмулятором дисплея покупателя через БПО

управление торговлей типовой функционал

См. также

Механизмы типовых конфигураций Программист Платформа 1С v8.3 1С:ERP Управление предприятием 2 Бесплатно (free)

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

27.02.2025    622    PROSTO-1C    0    

5

Механизмы типовых конфигураций HighLoad оптимизация Программист Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Бухгалтерский учет Бесплатно (free)

Пример популярной пользовательской настройки плана счетов. К чему это может привести, почему «всё тормозит» и как это поправить.

18.02.2025    3080    pbelousov    10    

6

Механизмы типовых конфигураций Программист Платформа 1С v8.3 1C:Бухгалтерия Бесплатно (free)

Расчет себестоимости в типовых конфигурациях 1С – для многих «черный ящик», работающий по жестко зашитым в него алгоритмам. Реализация этого «черного ящика» может меняться в зависимости от конкретной конфигурации – УПП, БП 3.0, ERP. Но принцип работы везде одинаковый. Расскажем о том, как устроен расчет себестоимости, как его дорабатывать, и какие методы могут быть эффективны и без доработок.

27.12.2024    13201    Begemoth80    32    

86

СКД Механизмы типовых конфигураций Запросы Программист Платформа 1С v8.3 1С:Зарплата и кадры государственного учреждения 3 1С:Зарплата и Управление Персоналом 3.x Россия Бесплатно (free)

Работая с типовыми отчетами в конфигурациях «Зарплата и управление персоналом, редакция 3», «Зарплата и кадры государственного учреждения, редакция 3» и подобных, в схемах компоновки данных можно встретить конструкции запросов, которые обращаются к некоторым виртуальным таблицам.

20.08.2024    2935    PROSTO-1C    0    

22

Механизмы типовых конфигураций Программист Платформа 1С v8.3 1С:Комплексная автоматизация 2.х Россия Бесплатно (free)

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

01.07.2024    3020    Vidz    0    

12
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. kalyaka 1128 24.03.25 12:57 Сейчас в теме
подход по кэшированию выделенных строки табличных частей
Для чего используется этот подход? Чтобы искать измененные строки?
2. aximo 2197 24.03.25 13:43 Сейчас в теме
Вероятно для того, чтобы сохранить какой-либо собранный отбор в реквизит и использовать в дальнейшем )
3. maksa2005 555 25.03.25 04:28 Сейчас в теме
Разбивка должна быть хотя бы пропорциональной.... буфер за 10 лет опыта ниразу не пригодился
4. aximo 2197 25.03.25 05:37 Сейчас в теме
В буфере можно хранить записи о подключенном торговом оборудование, например… довольно часто этим пользуюсь
Оставьте свое сообщение