Таблица значений 1С — это универсальная коллекция значений, которую разработчик может использовать при программной разработке для реализации своих алгоритмов. По сути, таблица значений 1С представляет собой динамический набор значений, имеющих колонки и столбцы.
Работая в конфигураторе 1С, программист может создать таблицу значений, как при помощи кода, так и интерактивно на форме.
На любой управляемой форме 1С 8.3 разработчик может разместить таблицу значений в виде реквизита формы. Для этого нужно создать новый реквизит и задать ему тип «Таблица значений».
Таблица значений на форме размещается в виде элемента формы Таблица. Это элемент будет создан автоматически, если мы перетащим мышкой реквизит с типом таблица значений в дерево элементов.
Но если у Вас нет задачи, чтобы пользователь как-то интерактивно работал с таблицей значений на форме, то совсем необязательно создавать реквизит формы с типом таблица значений. Разработчик может работать с таблицей значений из встроенного языка программирования 1С.
Программное создание таблицы значений 1С
Вы можете создать таблицу значений в любом программном модуле при помощи оператора Новый.
ТЗ = Новый ТаблицаЗначений;
Эта таблица значений будет существовать в том контексте, в котором Вы её создали: если Вы создали её в процедуре или функции, то она будет существовать до того момента пока выполняется эта процедура или функция. Если Вы её создали в программном модуле объекта, то таблица значений будет существовать пока выполняется обращение к этому объекту.
Но имейте в виду, что если вы создали таблицу значений в процедуре или функции программного модуля управляемой формы 1С 8.3, то на клиенте (под директивой &НаКлиенте) код будет выполняться только в толстом клиенте. В тонком клиенте и на веб-клиенте нельзя работать с таблицей значений. Возникнет ошибка!
Но, на тонком и веб-клиенте нельзя работать только с таблицей значений 1С, которая создана программно (с помощью оператора Новый). Если же таблица значений создана на форме в виде реквизита, то обращаться к этому реквизиту можно в любом контексте, платформа преобразует её в объект ДанныеФормыКоллекция.
Как я уже говорил, вся информация в таблице значений в платформе 1С 8.3 разбита на колонки и на строки, причем каждая колонка таблицы должна иметь свое уникальное название. В том случае, если таблица выводится на форму посредством элемента Таблица, то у данного элемента могут быть все колонки, которые имеются у соответствующего реквизита с типом таблица значений с соответствующими именами. Причем количество колонок в Таблице на форме может быть меньше, чем непосредственно в таблице значений, то есть не все колонки из таблицы значений нужно отображать в таблице.
Нет никаких ограничений на количество колонок. Количество колонок, как правило, всегда фиксировано и задается разработчиком на этапе создания нужного функционала, а количество строк переменно.
У таблиц значений есть ряд полезных методов, которые позволяют сортировать таблицу по определенным колонкам, сворачивать, получать итог по конкретной колонке, осуществлять выборку части строк по определенным параметрам и многое другое.
О работе с колонками и строками в таблицах значений 1С читайте в статьях по ссылкам:
Колонки таблицы значений в 1С 8.3 (8.2)
Строки таблицы значений в 1С 8.3 (8.2)
Методы таблиц значений 1С 8.3. Часть 1. Поиск и копирование
Методы таблиц значений 1С 8.3. Часть 2. Сортировка, итоги и свертка.
Статьи о других универсальных коллекциях значений в 1С
Соответствия в 1С
Массивы в 1С
Список значений в 1С
Структура в 1С
Дерево значений 1С
Более подробно о работе с таблицами значений и другими интересными объектами языка программирования в 1С читайте в моей книге «Программировать в 1С за 11 шагов»
Книга «Программировать в 1С за 11 шагов»
Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»
- Книга написана понятным и простым языком — для новичка.
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Научитесь понимать архитектуру 1С;
- Станете писать код на языке 1С;
- Освоите основные приемы программирования;
- Закрепите полученные знания при помощи задачника;
Книга «Основы разработки в 1С: Такси»
Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.
- Очень доступный и понятный язык изложения
- Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
- Поймете идеологию управляемого приложения 1С
- Узнаете, как разрабатывать управляемое приложение;
- Научитесь разрабатывать управляемые формы 1С;
- Сможете работать с основными и нужными элементами управляемых форм
- Программирование под управляемым приложением станет понятным
Промо-код на скидку в 15% — 48PVXHeYu
Если Вам помог этот урок решить какую-нибудь проблему, понравился или оказался полезен, то Вы можете поддержать мой проект, перечислив любую сумму:
можно оплатить вручную:
Яндекс.Деньги — 410012882996301
Web Money — R955262494655
Вступайте в мои группы:
Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009
ТаблицаЗначений управляемые формы |
Я |
07.05.14 — 10:01
Здравствуйте. Управляемые формы. В документе есть реквизит ФОРМЫ с типом «ТаблицаЗначений». По кнопке «Загрузить» открывается форма обработки, которая должна загрузить в эту таблицу данные из екселя. пока по кнопке Загрузить следующий код:
ПараметрыФормы = Новый Структура(«Документ», Объект.Ссылка);
Обработка = ПолучитьФорму(«Обработка.ЗагрузкаПланирование.Форма», ПараметрыФормы, ЭтаФорма);
Обработка.ОткрытьМодально();
В процедуре ПриСозданииНаСервере в форме обработки:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Объект.ОбъектСтроительства = Параметры.Документ.ОбъектСтроительства;
КонецПроцедуры
но так я могу получить доступ к реквизитам объектам, а мне нужно именно формы получить ту таблицу значений и заполнить ее. подскажите, пожалуйста, как можно это реализовать
1 — 07.05.14 — 10:07
(0) 1. Не надо использовать модальное открытие форм, надо пользоваться методом ОткрытьФорму(), а у формы устанавливать режим блокирования владельца.
На сервере можно так: Таблица = РеквизитФормыВЗначение(«ФОРМЫ»);
В этом стучае Таблица это таблица значений, как работать с неё знаешь.
После окончания её изменения необходимо преобразовать её в реквизит формы: ЗначениеВРеквизитФормы()
2 — 07.05.14 — 10:26
(1) первый пункт исправила, спасибо за уточнение про открытие форм. Второй пункт: если бы нужно было менять в этой же форме то понятно, можно так сделать. вопрос как передать эту таблицу значений в форму обработки и там его менять.
Передать вот так получилось:
ТаблицаПрогноза = ДанныеФормыВЗначение(TOTALКалендарный, Тип(«ТаблицаЗначений»));
ПараметрыФормы = Новый Структура(«Документ, ТаблицаПрогноза», Объект.Ссылка,ТаблицаПрогноза);
Обработка = ПолучитьФорму(«Обработка.ЗагрузкаПланирование.Форма», ПараметрыФормы, ЭтаФорма);
Обработка.Открыть();
В обработке в форме:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ТаблицаПрогноза = Параметры.ТаблицаПрогноза;
КонецПроцедуры
получить могу, но как с ней дальше работать? и вернуть обратно, чтобы на форме документа отобразились загруженные мною данные из екселя.
3 — 07.05.14 — 10:30
(2) В клиентском контексте формы тип данных «ТаблицаЗначений» обрабатываться не может. В нем только массивы структур и тп
4 — 07.05.14 — 10:30
+(3) Ты с серверными вызовами борешся?
5 — 07.05.14 — 10:37
(4) я просто не знаю как в форме обработки с этой таблицей работать и вернуть ее обратно. ПриСозданииНаСервере я ее получила.
Дальше по кнопке «Выполнить в обработке»:
&НаКлиенте
Процедура Выполнить(Команда)
ЗагрузитьИзExcel();
КонецПроцедуры
&НаСервере
Функция ЗагрузитьИзExcel()
Попытка
Excel = Новый COMОбъект(«Excel.Application»);
Исключение
Сообщить(«Не найден Microfoft Excel.»);
Возврат Ложь;
КонецПопытки;
Попытка
WorkBook = Excel.WorkBooks.Open( Объект.ПутьКФайлу );
Исключение
Сообщить(«Excel не удалось открыть файл » + Объект.ПутьКФайлу );
Возврат Ложь;
КонецПопытки;
Конвертировать(Excel);
WorkBook.Saved = True;
Excel.Workbooks.Close();
Excel.Application.Quit();
Возврат Истина;
КонецФункции
&НаСервере
Процедура Конвертировать(Excel)
Лист = Excel.Sheets(Объект.НомерСтраницы);
Для индС = Объект.НомерПервойСтроки По Объект.НомерПоследнейСтроки Цикл
НоваяСтрока = ТаблицаПрогноза.Добавить(); // Здесь надо внести данные в таблицу значений, но естественно ТаблицаПрогноза тут не видна
Если ЗначениеЗаполнено(Объект.СтолбецВидПомещения) Тогда
НоваяСтрока.ВидПомещения = Перечисления.ВидыПомещений[СокрЛП(Лист.Cells(индС, Объект.СтолбецВидПомещения).Value)];
КонецЕсли;
КонецЦикла;
КонецПроцедуры
6 — 07.05.14 — 10:44
(5)
&НаСервере
Процедура Конвертировать(Excel)
ТаблицаПрогноза = РеквизитФормыВЗначение(«Формы»);
Лист = Excel.Sheets(Объект.НомерСтраницы);
Для индС = Объект.НомерПервойСтроки По Объект.НомерПоследнейСтроки Цикл
НоваяСтрока = ТаблицаПрогноза.Добавить(); // Здесь надо внести данные в таблицу значений, но естественно ТаблицаПрогноза тут не видна
Если ЗначениеЗаполнено(Объект.СтолбецВидПомещения) Тогда
НоваяСтрока.ВидПомещения = Перечисления.ВидыПомещений[СокрЛП(Лист.Cells(индС, Объект.СтолбецВидПомещения).Value)];
КонецЕсли;
КонецЦикла;
ЗначениеВРеквизитФормы(ТаблицаПрогноза, «Формы»);
КонецПроцедуры
7 — 07.05.14 — 11:01
+(6) Дело в том, что даже в серверном контексте формы реквизит «ФОРМЫ» имеет тип «ДанныеФормаКоллекция». Тип «ДанныеФормаКоллекция» позволяет добавлять строки и тп. По этому можно не преобразовывать в таблицу значений.
8 — 07.05.14 — 11:04
+(7) При этом, если не сервере необходимо работать именно с типом «ТаблицаЗначений», то необходимо выполнить преобразование данных:
до обработки
ТаблицаПрогноза = РеквизитФормыВЗначение(«Формы»);
после обработки
ЗначениеВРеквизитФормы(ТаблицаПрогноза, «Формы»);
При возврате на клиента «уедет» именно «ДанныеФормаКоллекция»
9 — 07.05.14 — 11:26
(8) это я понимаю. но так хорошо получается, если в одном модуле все делать. Сначала. Тыкаем кнопку загрузить, по которой должна открыться форма обработки «ЗагрузкаПланирование»:
&НаКлиенте
Процедура ЗагрузитьИзФайла(Команда)
Обработка = ПолучитьФорму(«Обработка.ЗагрузкаПланирование.Форма», ПараметрыФормы, ЭтаФорма);
Обработка.Открыть();
КонецПроцедуры
как в нее передать реквизит формы TOTALКалендарный, который имеет тип ТаблицаЗначений?
&НаКлиенте
Процедура ЗагрузитьИзФайла(Команда)
ТаблицаПрогноза = РеквизитФормыВЗначение(«Формы»);
ПараметрыФормы = Новый Структура(«ТаблицаПрогноза», ТаблицаПрогноза);
Обработка = ПолучитьФорму(«Обработка.ЗагрузкаПланирование.Форма», ПараметрыФормы, ЭтаФорма);
Обработка.Открыть();
КонецПроцедуры // так не отработает
У меня передать получилось вот так:
ТаблицаПрогноза = ДанныеФормыВЗначение(TOTALКалендарный, Тип(«ТаблицаЗначений»));
ПараметрыФормы = Новый Структура(«Документ, ТаблицаПрогноза», Объект.Ссылка,ТаблицаПрогноза);
Обработка = ПолучитьФорму(«Обработка.ЗагрузкаПланирование.Форма», ПараметрыФормы, ЭтаФорма);
Обработка.Открыть();
каковы должны быть мои действия в форме обработки а не документа
10 — 07.05.14 — 11:32
(9) Можно передать данные из другой формы через временное хранилище, но напрямую работать с таблицей значений можно только в серверном контексте формы.
11 — 07.05.14 — 11:34
Попробовала еще в ременным хранилищем.
В документе:
&НаКлиенте
Процедура ЗагрузитьИзФайла(Команда)
АдресХранилища = ПоместитьДанныеФормыВХранилище();
ПараметрыФормы = Новый Структура(«Адрес,Ключ», АдресХранилища, Объект.Ссылка);
Обработка = ПолучитьФорму(«Обработка.ЗагрузкаПланирование.Форма», ПараметрыФормы, ЭтаФорма);
Обработка.Открыть();
КонецПроцедуры
&НаСервере
Функция ПоместитьДанныеФормыВХранилище()
ТаблицаПрогноза = ДанныеФормыВЗначение(TOTALКалендарный, Тип(«ТаблицаЗначений»));
Возврат ПоместитьВоВременноеХранилище(ТаблицаПрогноза, УникальныйИдентификатор);
КонецФункции
В обработке:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ТаблицаПрогноза = ПолучитьИзВременногоХранилища(Параметры.Адрес);
КонецПроцедуры
как мне с ней тут дальше работать? на форме может тоже нужно создать таблицу значений и скопировать это туда?
12 — 07.05.14 — 11:38
&НаКлиенте
Процедура ЗагрузитьИзФайла(Команда)
ПараметрыФормы = Новый Структура(«ТаблицаПрогноза», ПоместитьКалендарь(Формы));
ОткрытьФорму(«Обработка.АппроксимацияДанных.Форма», Параметры, ЭтаФорма, ,,,, РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаСервере
Функция ПоместитьКалендарь()
Возврат ПоместитьВоВременноеХранилище(TOTALКалендарный, УникальныйИдентификатор);
КонецФункции
&НаСервере
Процедура ПриСозданииНаСервере()
Если ЭтоАдресВременногоХранилища(Параметры.ТаблицаПрогноза) Тогда
ТаблицаПрогноза = ПолучитьИзВременногоХранилища(Параметры.ТаблицаПрогноза);
КонецЕсли;
КонецПроцедуры
13 — 07.05.14 — 11:38
(12) Сори: «Обработка.АппроксимацияДанных.Форма — имя вашей формы обработки
14 — 07.05.14 — 11:39
Процедура ПриСозданииНаСервере() — это уже модуль открываемой формы
15 — 07.05.14 — 11:42
Если есть доступ к ИТС: «Минимизация количества серверных вызовов» — «Выполнение подбора элементов» — «7.2. В целях оптимизации передачи данных между формой объекта и формой подбора рекомендуется использовать временное хранилище, чтение и запись которого должна выполняться на сервере.»
http://its.1c.ru/db/v8std#content:2149184136:1
16 — 07.05.14 — 11:43
(14)Да, спасибо огромное. у меня так все и работает. Вопрос то что дальше делать. Получила я эту таблицу в процедуре на сервере. а как мне в нее внести изменения???
&НаКлиенте
Процедура ВыполнитьЗагрузку(Команда)
ЗагрузитьИзExcel();
ЭтаФорма.Закрыть();
КонецПроцедуры
&НаСервере
Функция ЗагрузитьИзExcel()
Попытка
Excel = Новый COMОбъект(«Excel.Application»);
Исключение
Сообщить(«Не найден Microfoft Excel.»);
Возврат Ложь;
КонецПопытки;
Попытка
WorkBook = Excel.WorkBooks.Open( Объект.ПутьКФайлу );
Исключение
Сообщить(«Excel не удалось открыть файл » + Объект.ПутьКФайлу );
Возврат Ложь;
КонецПопытки;
НоваяСтрока = ТаблицаПрогноза.Добавить();// вот тут это не отработает
WorkBook.Saved = True;
Excel.Workbooks.Close();
Excel.Application.Quit();
Возврат Истина;
КонецФункции
17 — 07.05.14 — 11:51
(16) на сервере ком объекты работать не будут.
18 — 07.05.14 — 11:53
Кстати путь к файлу — должен быть серверным )))
Те файл нужно передать опять таки на сервер через хранилище и обрабатывать там получив из хранилища.
19 — 07.05.14 — 11:56
(17) — сплошные расстройства(
20 — 07.05.14 — 11:58
(17) COMОбъект (COMObject) Доступность: Тонкий клиент, веб-клиент, сервер, толстый клиент, внешнее соединение.
Так что если на сервере установлен MS Excel, то будет работать.
А файл необходимо передать на сервер опять же через временное хранилище «ПоместитьФайл».
21 — 07.05.14 — 12:01
(20) это радует, но это уже другой вопрос) что с таблицей то в итоге делать? мне бы ее хоть как-то изменить и вернуть обратно для начала)
22 — 07.05.14 — 12:03
Попробовала добавить тоже реквизит на форму с типом ТаблицаЗначений.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ТаблицаПрогноза = ПолучитьИзВременногоХранилища(Параметры.Адрес);
Таблица1 = ДанныеФормыВЗначение(ЭтаФорма.TOTALКалендарный, Тип(«ТаблицаЗначений»));
Таблица1=ТаблицаПрогноза.Скопировать();
ЗначениеВДанныеФормы(Таблица1, ЭтаФорма.TOTALКалендарный);
КонецПроцедуры
но так работать не захотело
23 — 07.05.14 — 12:10
Адрес временного хранилища по которому мы поместили ТаблицаПрогноза в форме документа «живет» пока открыта форма документа. В этом случае можно вернуть подготовленную таблицу прогноза поместив по этому же адресу: Параметры.ТаблицаПрогноза. Только в этом случае либо параметр «Параметры.ТаблицаПрогноза» должен ключевым, либо этот адрес надо сохранить в реквизите формы обработки. А так же в форме документа надо сохранить в отдельной переменной адрес в который поместили ТаблицаПрогноза. Тогда после возврата в форму документа можно прочитать данные ТаблицаПрогноза по адресу.
24 — 07.05.14 — 12:11
+(23) Т.е. в (12) сделать так :
было
ПараметрыФормы = Новый Структура(«ТаблицаПрогноза», ПоместитьКалендарь(Формы));
стало
АдресДанных = ПоместитьКалендарь(Формы);
ПараметрыФормы = Новый Структура(«ТаблицаПрогноза», АдресДанных);
25 — 07.05.14 — 12:14
С вернуть разобрались, как изменить в обработке эту таблицу не в процедуре ПриСозднииНаСервере)
26 — 07.05.14 — 12:16
(23) (24) Отставить!
Мы же вызывали асинхронно форму, по этому необходимо возвращать данные в форму документа через механизм оповещений.
В форме документа реализовать обработчик «ОбработкаОповещения(ИмяСобытия, Параметр, Источник)»
В форме обработки при закрытии используя метод «Оповестить» передать в форму документа адрес во временном хранилище ТаблицаПрогноза.
27 — 07.05.14 — 12:16
(25) см. (7)
28 — 07.05.14 — 12:34
(27) — так, хорошо, я поняла можно не преобразовывать.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ТаблицаПрогноза = ПолучитьИзВременногоХранилища(Параметры.Адрес);
ЭтаФорма.TOTALКалендарный.Загрузить(ТаблицаПрогноза);
КонецПроцедуры
так тоже не копируется полученная таблица
29 — 07.05.14 — 12:42
(28)
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ТаблицаПрогноза = ПолучитьИзВременногоХранилища(Параметры.Адрес);
ЗначениеВДанныеФормы(ТаблицаПрогноза, «TOTALКалендарный»);
КонецПроцедуры
Если дальше в обработчиках команд формы TOTALКалендарный заполняется, то см. (6),(7),(8)
30 — 07.05.14 — 12:56
(29) Ошибка при вызове метода контекста (ЗначениеВДанныеФормы)
ЗначениеВДанныеФормы(ТаблицаПрогноза, «TOTALКалендарный»);
по причине:
Несоответствие типов (параметр номер ‘2’)
Хотя ТаблицаПрогноза тип ТаблицаЗначений и TOTALКалендарный тип ТаблицаЗначений, просто беда какая-то(
31 — 07.05.14 — 13:02
(30) Ну тада так:
&НаСервере
Процедура ПриСозданииНаСервере()
Если ЭтоАдресВременногоХранилища(Параметры.ТаблицаПрогноза) Тогда
ТаблицаПрогноза = ПолучитьИзВременногоХранилища(Параметры.ТаблицаПрогноза);
Для каждого СтрокаТаблицы Из ТаблицаПрогноза Цикл
НоваяСтрока = TOTALКалендарный.Добавить();
ЗаполнитьЗначение(НоваяСтрока, СтрокаТаблицы);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
an_str
32 — 07.05.14 — 15:54
su_mai, спасибо большущее…победила)
В данной статье описаны примеры программного создания объектов управляемой формы 1С — таблицы значений и динамического списка, и их программный вывод в элементы формы
Contents
- 1 Введение в управляемые формы 1С
- 2 Создание реквизита типа таблица значений и вывод на форму
- 3 Добавление условного оформления таблицы формы
- 4 Создание реквизита типа динамический список с заданными настройками и вывод на форму
- 5 Вывести динамический список в элементы управляемой формы 1С
- 6 Обновление параметров динамического списка программно
- 7 Полезные ссылки
Перед прочтением данной статьи рекомендуется ознакомиться с первой частью, в которой описаны примеры программного создания элементов, команд, реквизитов управляемой формы, а также описание стандартных возможностей для работы с ними.
В данной же части будет рассмотрено программное создание динамических списков, таблиц значений на форме, их вывод в элементы формы и стандартные возможности для работы.
Модифицировать формы рекомендуется программно для удобного обновления конфигураций и исключения конфликтов, а также для удобной поддержки кода. Со статьями о механизмах модификации можно ознакомиться в разделе полезных ссылок.
Также все описанные в текущем разделе процедуры и функции находятся во внешней обработке УпрФормы.
Примеры программного создания элементов, команд, реквизитов управляемой формы, а также описание стандартных возможностей для работы с ними можно будет посмотреть в части 1.
Для запуска обработки в режиме предприятия необходимо наличие объектов «Справочники.Номенклатура», подчиненный ему «Справочники.ХарактеристикиНоменклатуры» и «РегистрыСведений.ЦеныНоменклатуры”.
Создание реквизита типа таблица значений и вывод на форму
&НаСервере Процедура пр_СоздатьТаблицуЗначений() МассивДобавляемыхРеквизитов = Новый Массив; //добавить реквизит ТЗ МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("пр_ТаблицаЗначений", Новый ОписаниеТипов("ТаблицаЗначений"))); //добавить каждую колонку как отдельный реквизит МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Период", Новый ОписаниеТипов("Дата",,,,,Новый КвалификаторыДаты(ЧастиДаты.Дата)),"пр_ТаблицаЗначений" ,"Период")); МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Номенклатура", Новый ОписаниеТипов("СправочникСсылка.Номенклатура"),"пр_ТаблицаЗначений" ,"Номенклатура")); МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Характеристика", Новый ОписаниеТипов("СправочникСсылка.ХарактеристикиНоменклатуры"),"пр_ТаблицаЗначений" ,"Характеристика")); МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("ВидЦены", Новый ОписаниеТипов("СправочникСсылка.ВидыЦен"),"пр_ТаблицаЗначений" ,"Вид цены")); МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("Цена", Новый ОписаниеТипов("Число", ,,Новый КвалификаторыЧисла(15,2)), "пр_ТаблицаЗначений" ,"Цена")); ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); КонецПроцедуры &НаСервере Процедура пр_ВывестиТаблицуЗначений() пр_ВывестиТаблицуНаФорму(ЭтаФорма, "пр_ТаблицаЗначений", Элементы["пр_Страница2"], "Таблица цен"); КонецПроцедуры &НаСервере Процедура пр_ВывестиТаблицуНаФорму(Форма, ИмяТаблицы, Родитель, ЗаголовокТаблицы) Экспорт ТаблицаФормы = Форма.Элементы.Добавить(ИмяТаблицы, Тип("ТаблицаФормы"), Родитель); ТаблицаФормы.ПутьКДанным = ИмяТаблицы; ТаблицаФормы.Заголовок = ЗаголовокТаблицы; ТаблицаФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; ТаблицаФормы.ИзменятьПорядокСтрок = Ложь; ТаблицаФормы.ИзменятьСоставСтрок = Ложь; ТаблицаФормы.РазрешитьНачалоПеретаскивания = Ложь; СтруктураСвойств = Новый Структура(); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Период"); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Номенклатура"); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Характеристика"); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "ВидЦены"); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Цена", СтруктураСвойств); КонецПроцедуры &НаСервере Процедура пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, ИмяКолонки, СтруктураСвойств = Неопределено) НоваяКолонка = Форма.Элементы.Добавить(ИмяТаблицы+ИмяКолонки, Тип("ПолеФормы"), ТаблицаФормы); НоваяКолонка.Заголовок = ИмяКолонки; НоваяКолонка.ПутьКДанным = ИмяТаблицы + "." + ИмяКолонки; НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода; Если НЕ СтруктураСвойств = Неопределено Тогда Для Каждого КлючЗначение Из СтруктураСвойств Цикл Попытка НоваяКолонка[КлючЗначение.Ключ] = СтруктураСвойств[КлючЗначение.Ключ]; Исключение КонецПопытки; КонецЦикла; КонецЕсли; КонецПроцедуры
Добавление условного оформления таблицы формы
Создаем условное оформление для таблицы:
- если реквизит формы Использование (тип булево) = Истина, тогда разрешаем изменять цену в строках таб. части;
- если в строке таб части цена не заполнена, то выделять фон ячейки «Цена» розовым.
&НаСервере Процедура пр_ДобавитьУОТаблицыФормы() //условное оформление формы //если реквизит Использование = Истина, то разрешать изменять цену ЭлементОформления = УсловноеОформление.Элементы.Добавить(); // Создаем условие отбора в созданной группе: ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("пр_Использование"); // имя поля ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; // либо задаем свой ЭлементОтбора.ПравоеЗначение = Ложь; ЭлементОтбора.Использование = Истина; // Установка значения элемента УО ЭлементОформления.Оформление.УстановитьЗначениеПараметра("Доступность", Ложь); ЭлементОформления.Использование = Истина; ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветТекста", WebЦвета.КрасноФиолетовый); ЭлементОформления.Использование = Истина; // Создаем поля оформления ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); //чтобы выделить ячейку, нужно указать имя соответствующего элемента на форме ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("пр_ТаблицаЗначенийЦена"); ПолеОформления.Использование = Истина; //условное оформление формы //если в строке цена = 0, тогда строку закрашиваем розовым ЭлементОформления = УсловноеОформление.Элементы.Добавить(); // Создаем условие отбора в созданной группе: ЭлементОтбора = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("пр_ТаблицаЗначений.Цена"); // имя поля ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеЗаполнено; // либо задаем свой ЭлементОтбора.Использование = Истина; // Установка значения элемента УО ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.Розовый); ЭлементОформления.Использование = Истина; // Создаем поля оформления //чтобы выделить всю строку, нужно добавить все ячейки строки, пока же выделим одну ячейку "Цена" ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("пр_ТаблицаЗначенийЦена"); ПолеОформления.Использование = Истина; КонецПроцедуры
В процедуру команды добавим вызов серверной процедуры для заполнения таблицы цен в зависимости от выбранной номенклатуры и характеристики:
&НаКлиенте Процедура пр_Команда1(Команда) пр_Команда1НаСервере(); КонецПроцедуры &НаСервере Процедура пр_Команда1НаСервере() ЭтаФорма["пр_ТаблицаЗначений"].Очистить(); Запрос = Новый Запрос; Запрос.УстановитьПараметр("Номенклатура", ЭтаФорма.пр_Номенклатура); Запрос.УстановитьПараметр("Характеристика", ЭтаФорма.пр_Характеристика); Запрос.Текст = "ВЫБРАТЬ | ЦеныНоменклатурыСрезПоследних.Период КАК Период, | ЦеныНоменклатурыСрезПоследних.Номенклатура КАК Номенклатура, | ЦеныНоменклатурыСрезПоследних.Характеристика КАК Характеристика, | ЦеныНоменклатурыСрезПоследних.ВидЦены КАК ВидЦены, | ЦеныНоменклатурыСрезПоследних.Цена КАК Цена |ИЗ | РегистрСведений.ЦеныНоменклатуры.СрезПоследних( | , | Номенклатура = &Номенклатура | И Характеристика = &Характеристика) КАК ЦеныНоменклатурыСрезПоследних"; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Стр = ЭтаФорма["пр_ТаблицаЗначений"].Добавить(); ЗаполнитьЗначенияСвойств(Стр, Выборка); КонецЦикла; КонецПроцедуры
Добавляем в процедуру ПриСозданииНаСервере процедуры:
&НаСервере Процедура пр_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) //установим заголовок формы ЭтаФорма.Заголовок = "Шаблон для программной работы с реквизитами, командами и элементами формы"; ЭтаФорма.АвтоЗаголовок = Ложь; пр_СоздатьГруппы(); пр_СоздатьНовуюКоманду(); пр_СоздатьДекорацию(); пр_СоздатьРеквизиты(); пр_УдалитьРеквизиты(); пр_ВывестиРеквизитыНаФорму(); пр_СоздатьТаблицуЗначений(); пр_ВывестиТаблицуЗначений(); пр_ДобавитьУОТаблицыФормы(); КонецПроцедуры
Заполняем реквизиты Номенклатура, Характеристика и заполняем цены в таблице значений.
Создание реквизита типа динамический список с заданными настройками и вывод на форму
На странице 3 создадим динамический список с выводом всех цен выбранной номенклатуры и характеристики.
Добавим Условное Оформление дин. списка, отбор и сортировку программно.
&НаСервере Процедура пр_СоздатьДинамическийСписок() //создать дин. список с произвольным запросом ТекстЗапроса = "ВЫБРАТЬ | ЦеныНоменклатуры.Период КАК Период, | ЦеныНоменклатуры.Номенклатура КАК Номенклатура, | ЦеныНоменклатуры.Характеристика КАК Характеристика, | ЦеныНоменклатуры.ВидЦены КАК ВидЦены, | ЦеныНоменклатуры.Цена КАК Цена, | ЦеныНоменклатуры.Регистратор КАК Регистратор |ИЗ | РегистрСведений.ЦеныНоменклатуры КАК ЦеныНоменклатуры |ГДЕ | ЦеныНоменклатуры.Номенклатура = &Номенклатура | И ЦеныНоменклатуры.Характеристика = &Характеристика"; МассивДобавляемыхРеквизитов = Новый Массив; //создать реквизит дин. списка МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы("пр_ДинамическийСписок", Новый ОписаниеТипов("ДинамическийСписок"),,,ЛОЖЬ)); ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); РеквизитДинамическийСписок = ЭтаФорма["пр_ДинамическийСписок"]; //если запрос не произвольный, тогда используем следующий код: //РеквизитДинамическийСписок.ПроизвольныйЗапрос = Ложь; //РеквизитДинамическийСписок.ОсновнаяТаблица = "РегистрСведений.ЦеныНоменклатуры"; РеквизитДинамическийСписок.ПроизвольныйЗапрос = Истина; РеквизитДинамическийСписок.ОсновнаяТаблица = "РегистрСведений.ЦеныНоменклатуры"; РеквизитДинамическийСписок.ТекстЗапроса = ТекстЗапроса; РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра("Номенклатура", ЭтаФорма["пр_Номенклатура"]); РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра("Характеристика", ЭтаФорма["пр_Характеристика"]); //не будем выводить эту колонку в списке, но нужен к ней доступ всегда РеквизитДинамическийСписок.УстановитьОбязательноеИспользование("Регистратор", Истина); КонецПроцедуры &НаСервере Процедура пр_ДобавитьОтборДинамическийСписок() ЭлементОтбора = ЭтаФорма["пр_ДинамическийСписок"].Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Период"); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше; // больше или меньше и т.п. ЭлементОтбора.Использование = Истина; ЭлементОтбора.ПравоеЗначение = Дата('2015.01.01 00:00:00'); КонецПроцедуры &НаСервере Процедура пр_ДобавитьУОДинамическийСписок() //если цена от 4000 до 5000, то выделять зеленым ЭлементОформления = ЭтаФорма["пр_ДинамическийСписок"].УсловноеОформление.Элементы.Добавить(); //сначала добавим группу И ГруппаОформления = ЭлементОформления.Отбор.Элементы.Добавить(Тип("ГруппаЭлементовОтбораКомпоновкиДанных")); ГруппаОформления.Использование = Истина; ГруппаОформления.ТипГруппы = ТипГруппыЭлементовОтбораКомпоновкиДанных.ГруппаИ; // Создаем условие отбора в созданной группе: цена > 4000 ЭлементОтбора = ГруппаОформления.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Цена"); // имя поля ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Больше; // либо задаем свой ЭлементОтбора.ПравоеЗначение = 4000; //правым значением может выступать ПолеКомпоновкиДанных формы или списка //ЭлементОтбора.ПравоеЗначение = Новый ПолеКомпоновкиДанных(ИмяПоля); ЭлементОтбора.Использование = Истина; //второй элемент отбора: цена < 5000 ЭлементОтбора = ГруппаОформления.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных")); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Цена"); // имя поля ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Меньше; // либо задаем свой ЭлементОтбора.ПравоеЗначение = 5000; ЭлементОтбора.Использование = Истина; // Установка значения элемента УО ЭлементОформления.Оформление.УстановитьЗначениеПараметра("ЦветФона", WebЦвета.ЗеленыйЛес); // Возможно обращение как по индексу так и установка через метод //Элемент = ЭлементОформления.Оформление.Элементы[0]; //Элемент.Значение = Цвет; ЭлементОформления.Использование = Истина; // Создаем поля оформления ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); //чтобы выделить ячейку, нуджно указать ее имя поля ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Период"); ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Номенклатура"); ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Характеристика"); ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("ВидЦены"); ПолеОформления = ЭлементОформления.Поля.Элементы.Добавить(); ПолеОформления.Поле = Новый ПолеКомпоновкиДанных("Цена"); ПолеОформления.Использование = Истина; КонецПроцедуры &НаСервере Процедура пр_ДобавитьСортировкуДинамическийСписок() ЭлементСортировки = ЭтаФорма["пр_ДинамическийСписок"].Порядок.Элементы.Добавить(Тип("ЭлементПорядкаКомпоновкиДанных")); ЭлементСортировки.Поле = Новый ПолеКомпоновкиДанных("Период"); ЭлементСортировки.ТипУпорядочивания = НаправлениеСортировкиКомпоновкиДанных.Убыв; ЭлементСортировки.Использование = Истина; КонецПроцедуры
Вывести динамический список в элементы управляемой формы 1С
Для вывода дин. списка воспользуемся процедурами, которые использовали при выводе таблицы значений, так как это один тип — ДанныеФормыКоллекция.
&НаСервере Процедура пр_ВывестиДинамическийСписок() пр_ВывестиДинамическийСписокНаФорму(ЭтаФорма, "пр_ДинамическийСписок", Элементы["пр_Страница3"], "Таблица цен"); КонецПроцедуры Процедура пр_ВывестиДинамическийСписокНаФорму(Форма, ИмяТаблицы, Родитель, ЗаголовокТаблицы) Экспорт ТаблицаФормы = Форма.Элементы.Добавить(ИмяТаблицы, Тип("ТаблицаФормы"), Родитель); ТаблицаФормы.ПутьКДанным = ИмяТаблицы; ТаблицаФормы.Заголовок = ЗаголовокТаблицы; ТаблицаФормы.ПоложениеЗаголовка = ПоложениеЗаголовкаЭлементаФормы.Верх; СтруктураСвойств = Новый Структура("Вид", ВидПоляФормы.ПолеНадписи); //если нужны какие-то специфические свойства колонки, то нужно их добавить в структуру свойств пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Период", СтруктураСвойств); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Номенклатура", СтруктураСвойств); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Характеристика", СтруктураСвойств); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "ВидЦены", СтруктураСвойств); пр_ДобавитьНовуюКолонку(Форма, ТаблицаФормы, ИмяТаблицы, "Цена", СтруктураСвойств); КонецПроцедуры
Обновление параметров динамического списка программно
Если в запросе дин. списка используются параметры, то их необходимо обновлять при изменении соответствующих реквизитов.
&НаСервере Процедура пр_ОбновитьПараметрДинСписков(ИмяЭлемента, ТекСсылка) РеквизитДинамическийСписок = ЭтаФорма["пр_ДинамическийСписок"]; РеквизитДинамическийСписок.Параметры.УстановитьЗначениеПараметра(ИмяЭлемента, ТекСсылка); КонецПроцедуры &НаКлиенте Процедура пр_НоменклатураПриИзменении(Элемент) пр_ОбновитьПараметрДинСписков("Номенклатура", ЭтаФорма["пр_Номенклатура"]); КонецПроцедуры &НаКлиенте Процедура пр_ХарактеристикаПриИзменении(Элемент) пр_ОбновитьПараметрДинСписков("Характеристика", ЭтаФорма["пр_Характеристика"]); КонецПроцедуры
Добавляем в процедуру ПриСозданииНаСервере процедуры:
&НаСервере Процедура пр_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) //установим заголовок формы ЭтаФорма.Заголовок = "Шаблон для программной работы с реквизитами, командами и элементами формы"; ЭтаФорма.АвтоЗаголовок = Ложь; пр_СоздатьГруппы(); пр_СоздатьНовуюКоманду(); пр_СоздатьДекорацию(); пр_СоздатьРеквизиты(); пр_УдалитьРеквизиты(); пр_ВывестиРеквизитыНаФорму(); пр_СоздатьДинамическийСписок(); пр_ДобавитьОтборДинамическийСписок(); пр_ДобавитьСортировкуДинамическийСписок(); пр_ДобавитьУОДинамическийСписок(); пр_ВывестиДинамическийСписок(); КонецПроцедуры
Заполняем реквизиты Номенклатура, Характеристика и заполняем цены в таблице значений.
Содержимое регистра сведений ЦеныНоменклатуры:
Динамический список на форме:
Полезные ссылки
1. Типовой механизм упрощенного изменения конфигурации в ERP 2.0 и УТ 11
2. Типовой функционал модификации конфигурации линейки ERP-решений (УТ 11, КА 2 и ERP 2)
3. 1С Управляемые Формы. Программное создание реквизитов , команд, элементов (Часть 1)
Перейти в основной раздел:
Выводим на форму заполненную Таблицу значений в 1С 8.3:
&НаСервере
Процедура ПриОткрытииНаСервере()// Описание таблицы значений как реквизита
МассивТипа = Новый Массив;
МассивТипа.Добавить(Тип(«ТаблицаЗначений»));// Добавление ТаблицыЗначений в массив реквизитов
ОписаниеТипа = Новый ОписаниеТипов(МассивТипа);
МассивРеквизитовФормы = Новый Массив;
МассивРеквизитовФормы.Добавить(Новый РеквизитФормы(«ТаблицаСотрудников», ОписаниеТипа, «», «ТЗСотр»));// Создание ТаблицыЗначений с описанием колонок
КвалификаторыСтроки = Новый КвалификаторыСтроки(10);
ОписаниеСтроки_10 = Новый ОписаниеТипов(«Строка», ,КвалификаторыСтроки);ОписаниеСотрудника = Новый ОписаниеТипов(«СправочникСсылка.Сотрудники»);ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить(«Код», ОписаниеСтроки_10);
ТЗ.Колонки.Добавить(«Сотрудник», ОписаниеСотрудника);
// ТЗ.Колонки.Добавить — можно и в цикле
// Добавление в массив реквизитов колонок ТаблицыЗначений
Для Каждого Колонка Из ТЗ.Колонки Цикл
МассивРеквизитовФормы.Добавить(Новый РеквизитФормы(Колонка.Имя, Колонка.ТипЗначения, «ТаблицаСотрудников»));
КонецЦикла;// Удаление — если таблица существует
ЭлементТаблица = Элементы.Найти(«ТаблицаСотрудников»);
Если ЭлементТаблица <> Неопределено Тогда
Элементы.Удалить(ЭлементТаблица);
Иначе
ИзменитьРеквизиты(МассивРеквизитовФормы);
КонецЕсли;// Добавление ТаблицыЗначений на форму
ТаблицаПолейВыбора = Элементы.Добавить(«ТЗСотр», Тип(«ТаблицаФормы»));
ТаблицаПолейВыбора.ПутьКДанным = «ТаблицаСотрудников»;
ТаблицаПолейВыбора.Отображение = ОтображениеТаблицы.Список;
ТаблицаПолейВыбора.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; // Отключение командной панелиДля Каждого Колонка Из ТЗ.Колонки ЦиклНовыйЭлемент = Элементы.Добавить(Колонка.Имя, Тип(«ПолеФормы»), ТаблицаПолейВыбора);
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = «ТаблицаСотрудников.» + Колонка.Имя;
НовыйЭлемент.Ширина = 10;
КонецЦикла;
// Заполнение ТаблицыЗначений
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| Сотрудники.Код КАК Код,
| Сотрудники.ГоловнаяОрганизация КАК ГоловнаяОрганизация,
| Сотрудники.Ссылка КАК Ссылка,
| Сотрудники.Наименование КАК Наименование
|ИЗ
| Справочник.Сотрудники КАК Сотрудники
|
|УПОРЯДОЧИТЬ ПО
| Наименование»;РезультатЗапроса = Запрос.Выполнить();ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Строка = ТЗ.Добавить();
Строка.Код = ВыборкаДетальныеЗаписи.Код;
Строка.Сотрудник = ВыборкаДетальныеЗаписи.Ссылка;
КонецЦикла;// Передача ТаблицыЗначений в реквизит формы
ЗначениеВРеквизитФормы(ТЗ, «ТаблицаСотрудников»);
КонецПроцедуры
Обработка события Таблицы на форме в 1С 8.3:
//Для добавления обработчика события таблицы «Выбор»:
ТаблицаПолейВыбора.УстановитьДействие(«Выбор»,«ТЗВыбор»);//Для обработки данного события в форме процедуры прописывается отдельная процедура (НаКлиенте):
&НаКлиенте
Процедура ТЗВыбор(ТЗ, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
//Код для обработки обработчика
КонецПроцедуры
Чтение программно созданной Таблицы на форме в 1С 8.3:
// При обращении к реквизиту получите ошибку: Переменная не определена
// Для чтения реквизита, который создан программно, используется метод РеквизитФормыВЗначениеТекущаяТаблица=РеквизитФормыВЗначение(«ТаблицаСотрудников»);
Copyright©, «Программист 1С в г.Минске», 27.04.2020
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
это код на сервере или на клиенте?
Добавлено через 14 минут
я когда пишу
строка.реквизит1 =…..
говорит реквизит не найден.
/////
мож я не правильно объяснил.
кароч я хочу закинуть выгрузку запроса во вспомогательный реквизит упр. формы, имеющий тип «таблицазначений».
чтобы больше сервер не тягать, чтобы сразу всё вытащить на форму.
а так вроде не получается, когда преобразуем данные в реквизит и реквизит в данные, там вроде не все данные передаются..
в любом случае спасибо за совет
Добавлено через 39 минут
если вручную реквизиты писать как вы написали,
новстр.реквизит1 = «акрпакр»;
то поле объекта не обнаружено, выдает:
{Документ.ПриходнаяНакладная.Форма.ФормаДокумента. Форма(114)}: Поле объекта не обнаружено (реквизит1)
а если
1C | ||
|
то на форме в реквизите «таблица» недоступны те поля выборки которые были в ТЗ.
//////////////////////////////
на форме на клиенте даже нельзя добавить строку к Таблице значений.
Добавлено через 3 минуты
даже если просто так написать
1C | ||
|
то поля ТЗ недоступны в Таблице.
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
&НаСервере Процедура ВыполнитьКодНаСервере() /// Как создать таблицу значений в 1с 8.3, 8.2 // с таблицей значений можно работать только на сервере Таб = Новый ТаблицаЗначений; /// Как добавить колонки в таблицу значений в 1с 8.3, 8.2 Таб.Колонки.Добавить("Фрукт"); Таб.Колонки.Добавить("Цвет"); Таб.Колонки.Добавить("Вкус"); /// Как добавить строки в таблицу значений в 1с 8.3, 8.2 Стр = Таб.Добавить(); Стр.Фрукт = "Яблоко"; Стр.Цвет = "Зелёный"; Стр.Вкус = "Кислый"; Стр = Таб.Добавить(); Стр.Фрукт = "Банан"; Стр.Цвет = "Желтый"; Стр.Вкус = "Сладкий"; Стр = Таб.Добавить(); Стр.Фрукт = "Слива"; Стр.Цвет = "Синий"; Стр.Вкус = "Терпкий"; /// Как добавить в таблицу значений колонку с /// описанием типа и заголовка в 1с 8.3, 8.2 ОписаниеВеса = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(12, 3)); Таб.Колонки.Добавить("ВесФрукта", ОписаниеВеса, "Вес фрукта"); Таб[0].ВесФрукта = 100.005; Таб[1].ВесФрукта = 60.010; Таб[2].ВесФрукта = 25.000; /// Как перечислить все строки в таблице значений в 1с 8.3, 8.2 Для Каждого Стр Из Таб Цикл Сообщить(Стр.Фрукт + " " + Стр.Цвет + " " + Стр.Вкус + " " + Стр.ВесФрукта); КонецЦикла; /// Как перечислить все колонки в таблице значений /// в 1с 8.3, 8.2 Для Каждого Колонка Из Таб.Колонки Цикл Сообщить(Колонка.Имя); КонецЦикла; /// Как выгрузить колонку таблицы значений в массив в 1с 8.3, 8.2 // выгрузка названий фруктов в массив МассивФруктов = Таб.ВыгрузитьКолонку("Фрукт"); // ничего не измениться, так как массив не менялся Таб.ЗагрузитьКолонку(МассивФруктов, "Фрукт"); /// Как заполнить значения в колонке для всех строк таблицы /// значений в 1с 8.3, 8.2 // обнулим вес во всех строках Таб.ЗаполнитьЗначения(0, "ВесФрукта"); // выставим новые веса Таб[0].ВесФрукта = 100; Таб[1].ВесФрукта = 60; Таб[2].ВесФрукта = 25; /// Как в таблице значений посчитать итог по колонке в 1с 8.3, 8.2 Сообщить(Таб.Итог("ВесФрукта")); // 185 /// Как найти строку в таблице значений по значению в 1с 8.3, 8.2 // найдём строчку с яблоком и покажем его цвет НайденнаяСтрока = Таб.Найти( "Яблоко" ); Если НайденнаяСтрока <> Неопределено Тогда Сообщить(НайденнаяСтрока.Цвет); // Зелёный КонецЕсли; /// Как найти строку в таблице значений поиском значения /// в определенных колонках в 1с 8.3, 8.2 // будем искать по слову "Кислый" в колонках вкус и цвет НайденнаяСтрока = Таб.Найти("Кислый", "Вкус, Цвет"); Если НайденнаяСтрока <> Неопределено Тогда Сообщить(НайденнаяСтрока.Фрукт); // Яблоко КонецЕсли; // добавим ещё один зелёный фрукт Стр = Таб.Добавить(); Стр.Фрукт = "Киви"; Стр.Цвет = "Зелёный"; Стр.Вкус = "Сладкий"; Стр.ВесФрукта = 30; /// Как искать в таблице значений неуникальные значения /// в 1с 8.3, 8.2 Отбор = Новый Структура; Отбор.Вставить("Цвет", "Зелёный"); Строки = Таб.НайтиСтроки(Отбор); Для Каждого Стр Из Строки Цикл Сообщить(Стр.Фрукт); // Яблоко Киви КонецЦикла; /// Как сдвинуть строку таблицы значений в 1с 8.3, 8.2 // сдвигаем первую строку на одну позицию вперёд Таб.Сдвинуть(0, 1); // и возвращаем обратно Таб.Сдвинуть(1, -1); /// Как создать копию таблицы значений в 1с 8.3, 8.2 // полная копия КопияТаб = Таб.Скопировать(); /// Как создать копию таблицы значений по нужным колонкам /// в 1с 8.3, 8.2 // только две колонки будет Фрукт и Цвет КопияТаб = Таб.СкопироватьКолонки("Фрукт, Цвет"); /// Как создать копию таблицы значений по отбору в 1с 8.3, 8.2 Отбор = Новый Структура; Отбор.Вставить("Фрукт", "Яблоко"); // таблица будет содержать только строчку с яблоком КопияТаб = Таб.Скопировать(Отбор); // таблица будет содержать цвет и вес яблока КопияТаб = Таб.Скопировать(Отбор, "Цвет, ВесФрукта"); /// Как свернуть таблицу значений по колонке в 1с 8.3, 8.2 // свернём по вкусу, просуммируем по весу Таб.Свернуть("Вкус", "ВесФрукта"); /// Как отсортировать таблицу значений по колонке в 1с 8.3, 8.2 Таб.Сортировать("ВесФрукта Возр"); /// Как отсортировать таблицу значений по нескольким колонкам /// в 1с 8.3, 8.2 Таб.Сортировать("ВесФрукта Возр, Вкус Убыв"); /// Как удалить строку из таблицы значений в 1с 8.3, 8.2 // по индексу или по значению Таб.Удалить(0); КонецПроцедуры /// Как программно вывести таблицу значений на /// форму в 1с 8.3, 8.2 // см. примеры использования этой функции ниже // ТабВКоде - таблица значений, созданная программно // ТабРеквизит - имя реквизита формы типа ТаблицаЗначений // ТабНаФорме - имя элемента формы, связанного с ТабРеквизит &НаСервере Процедура ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме(ТабВКоде, ТабРеквизит, ТабНаФорме) // реквизит ТабРеквизит и соответствующий // ему элемент формы ТабНаФорме уже созданы // нами в визуальном режиме // 1. добавляем колонки из ТабВкоде в реквизит ТабРеквизит НовыеРеквизиты = Новый Массив; Для Каждого Колонка Из ТабВКоде.Колонки Цикл НовыеРеквизиты.Добавить( Новый РеквизитФормы( Колонка.Имя, Колонка.ТипЗначения, ТабРеквизит ) ); КонецЦикла; ИзменитьРеквизиты(НовыеРеквизиты); // 2. добавляем колонки из ТабВКоде в элемент ТабНаФорме Для Каждого Колонка Из ТабВКоде.Колонки Цикл НовыйЭлемент = Элементы.Добавить( ТабРеквизит + "_" + Колонка.Имя, Тип("ПолеФормы"), Элементы[ТабНаФорме] ); НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода; НовыйЭлемент.ПутьКДанным = ТабРеквизит + "." + Колонка.Имя; КонецЦикла; // 3. наконец, передаём данные из ТабВКоде в ТабРеквизит ЗначениеВРеквизитФормы(ТабВКоде, ТабРеквизит); // готово! КонецПроцедуры &НаСервере Процедура СоздатьТаблицуНаФормеНаСервере() // программно создаём таблицу значений ТабВКоде ТабВКоде = Новый ТаблицаЗначений; ОписаниеСтроки = Новый ОписаниеТипов("Строка"); ОписаниеВеса = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(12, 3)); ТабВКоде.Колонки.Добавить("Фрукт", ОписаниеСтроки, "Имя фрукта"); ТабВКоде.Колонки.Добавить("Цвет", ОписаниеСтроки, "Цвет фрукта"); ТабВКоде.Колонки.Добавить("Вес", ОписаниеВеса, "Вес фрукта"); Стр = ТабВКоде.Добавить(); Стр.Фрукт = "Яблоко"; Стр.Цвет = "Зелёный"; Стр.Вес = 200; Стр = ТабВКоде.Добавить(); Стр.Фрукт = "Банан"; Стр.Цвет = "Желтый"; Стр.Вес = 150; ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме(ТабВКоде, "ТабРеквизит1", "ТабНаФорме1"); КонецПроцедуры /// Как программно вывести на форму результат запроса /// в виде таблицы значений в 1с 8.3, 8.2 &НаСервере Процедура ВывестиНаФормуРезультатЗапросаНаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Товары.Ссылка, | Товары.ВерсияДанных, | Товары.ПометкаУдаления, | Товары.Код, | Товары.Наименование, | Товары.Цвет, | Товары.ЕдиницаИзмерений, | Товары.Предопределенный, | Товары.ИмяПредопределенныхДанных |ИЗ | Справочник.Товары КАК Товары"; РезультатЗапроса = Запрос.Выполнить(); ТабВКоде = РезультатЗапроса.Выгрузить(ОбходРезультатаЗапроса.Прямой); // функция ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме определена выше ВывестиТаблицуЗначенияВКодеВТаблицуНаФорме(ТабВКоде, "ТабРеквизит2", "ТабНаФорме2"); КонецПроцедуры /// Скачать и выполнить эти примеры на компьютере
Итак для начала нам надо добавить реквизиты в форму. Для этого у нас есть метод: ИзменитьРеквизиты(). Перед тем как его использовать мы сформируем массив добавляемых реквизитов, который будет называться МассивДобавляемыхРеквизитов.
МассивДобавляемыхРеквизитов = Новый Массив; МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(«План», Новый ОписаниеТипов(«ТаблицаЗначений»))); |
Обратите внимание, что элементы массива у нас типа РеквизитФормы. Дальше помимо таблицы значений, нам надо добавить колонки таблицы, например будем добавлять три колонки:
[wp_ad_camp_3]
МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(«Номенклатура», Новый ОписаниеТипов(«СправочникСсылка.Номенклатура»),«План» ,«Номенклатура»)); МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(«Регион», Новый ОписаниеТипов(«Число»,Новый КвалификаторыЧисла(10,2)),«План» , «Регион»)); МассивДобавляемыхРеквизитов.Добавить(Новый РеквизитФормы(«Разница», Новый ОписаниеТипов(«Число»,Новый КвалификаторыЧисла(10,2)),«План» , «Осталось распределить»)); |
Во время добавления колонок в МассивДобавляемыхРеквизитов обязательно надо указать путь к создаваемому реквизиту, в нашем случае это «План», который был добавлен в массив ранее. Обратите внимание, что путь к создаваемому реквизиту не включает в себя сам реквизит. После того, как массив сформирован, можно вызывать изменение реквизитов:
ИзменитьРеквизиты(МассивДобавляемыхРеквизитов); |
После изменения реквизитов у нас уже есть нужный нам реквизит формы «План» типа ТаблицаЗначений с тремя колонками. Если вам надо будет обратиться к значению реквизита, то вы можете это сделать используя ЭтаФорма[«План»]. Можно приступать к созданию элементов формы, для отображения данных. Сначала создадим элемент формы типа ТаблицаФормы.
[wp_ad_camp_3]
ТаблицаФормы = Элементы.Добавить(«План», Тип(«ТаблицаФормы»)); ТаблицаФормы.ПутьКДанным = «План»; ТаблицаФормы.ПоложениеКоманднойПанели = ПоложениеКоманднойПанелиЭлементаФормы.Нет; ТаблицаФормы.ФиксацияСлева = 3; ТаблицаФормы.УстановитьДействие(«ПередУдалением», «ПланПередУдалением»); ТаблицаФормы.УстановитьДействие(«ПередНачаломДобавления», «ПланПередНачаломДобавления»); |
Как вы видите из приведенного когда, во время создания элемента мы тут же определяем действия на события. После создания элемента План типа ТаблицаФормы создадим подчиненные ему элементы типа ПолеФормы, которые будут отвечать у нас за вывод данных в колонки таблицы. Для этого в цикле перебора колонок таблицы необходимо выполнить следующий код (на примере одной из итераций цикла):
НоваяКолонка = Элементы.Добавить(«ПланНоменклатура», Тип(«ПолеФормы»), Элементы.План); НоваяКолонка.Заголовок = «Номенклатура»; НоваяКолонка.ПутьКДанным = «План.Номенклатура»; НоваяКолонка.Вид = ВидПоляФормы.ПолеВвода; НоваяКолонка.РежимРедактирования = РежимРедактированияКолонки.ВходПриВводе; |
Обратите внимание, что во время добавления элемента мы указываем родителя Элементы.План. Так же путь к данным у нас состоит из наименования реквизита типа ТаблицаЗначений и имени колонки, разделенные точкой. После того, как вы в цикле создадите все элементы для колонок форма будет готова к выводу и вводу данных в таблицу.
Теперь можно перейти ко второй части задачи про подсветку цветом колонки Номенклатура. Например условие у нас будет накладываться на колонку Разница и когда она будет равно 100 строку надо будет подсвечивать колонку Номенклатуры серым цветом.
Для реализации этой части задачи мы будем использовать объект УсловноеОформление, который доступен на стороне сервера. Сначала в элементы условного оформления необходимо добавить новый элемент. Затем мы добавляем оформляемые поля. Если надо подсвечивать всю строку, то можно обойти в цикле колонки и добавить все их поля ввода в оформляемые. Так же необходимо потом добавить отбор. В левом значении отбора указываем поле, по которому будет идти сравнение. Поле указывает с точкой, как путь к данным во время добавления колонки.
ЭлементУсловногоОформления = УсловноеОформление.Элементы.Добавить(); ОформляемоеПоле = ЭлементУсловногоОформления.Поля.Элементы.Добавить(); ОформляемоеПоле.Поле = Новый ПолеКомпоновкиДанных(«ПланНоменклатура»); ЭлементОтбора = ЭлементУсловногоОформления.Отбор.Элементы.Добавить(Тип(«ЭлементОтбораКомпоновкиДанных»)); ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных(«План.Разница»); ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.Равно; ЭлементОтбора.ПравоеЗначение = 100; ЭлементУсловногоОформления.Оформление.УстановитьЗначениеПараметра(«ЦветФона», WebЦвета.СеребристоСерый); |
[wp_ad_camp_3]