Как выбрать табличную часть документа


Организация подборов в табличную часть документа. Категория: 1С:Предприятие • Программирование

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

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

Результат подбора будет доступен в обработчике события ОбработкаВыбора формы документа или элемента формы (в зависимости от того, чему мы подчиним форму справочника при открытии). Событие ОбработкаВыбора в форме документа будет вызвано в двух случаях:

  • когда в форме справочника будет выполнен интерактивный выбор;
  • когда в форме справочника будет вызван метод ОповеститьОВыборе.

Одиночный подбор

При одиночном подборе форма справочника будет закрываться сразу после выбора элемента. Для выбора следующего элемента необходимо будет снова инициировать подбор.

Откроем форму документа ПриходнаяНакладная, создадим команду Подбор и назначим для нее обработчик:

&НаКлиенте Процедура ВыборОдногоЭлемента(Команда) // Форма выбора закрывается после двойного клика // по выбранному элементу ОткрытьФорму("Справочник.Номенклатура.ФормаВыбора",,Элементы.Материалы); КонецПроцедуры

В этой процедуре мы открываем форму выбора для справочника Номенклатура, указывая, что она подчинена таблице Материалы формы документа ПриходнаяНакладная (Элементы.Материалы). При выборе из формы выбора справочника выбранное значение будет передано в обработчик события ОбработкаВыбора таблицы формы Материалы, так как она является владельцем открытой формы выбора.

Поэтому откроем палитру свойств таблицы Материалы и создадим обработчик события ОбработкаВыбора:

&НаКлиенте Процедура МатериалыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) Элементы.Материалы.ДобавитьСтроку(); Элементы.Материалы.ТекущиеДанные.Материал = ВыбранноеЗначение; КонецПроцедуры

В этой процедуре мы добавляем новую строку в таблицу Материалы и присваиваем колонке Материал в новой строке выбранное в форме выбора справочника значение. Это значение передается в обработчик события в параметре ВыбранноеЗначение.

Множественный подбор

При множественном подборе форма справочника будет открыта до тех пор, пока пользователь не закроет ее интерактивно или не будет вызван метод формы Закрыть().

Обработчик команды Подбор:

&НаКлиенте Процедура ВыборЭлементовБезЗакрытияФормы(Команда) // Не закрывать форму после двойного клика; можно выбрать // несколько элементов, дважды кликая на каждом ПараметрыФормы = Новый Структура("ЗакрыватьПриВыборе", Ложь); ОткрытьФорму( "Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, Элементы.Материалы ); КонецПроцедуры

Обработчик события ОбработкаВыбора остается без изменений.

Подбор с использованием множественного выбора

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

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

Обработчик команды Подбор:

&НаКлиенте Процедура МножественныйВыбор(Команда) // Позволяем выделить и выбрать несколько элементов; в обработчик // ОбработкаВыбора() передается массив элементов ПараметрыФормы = Новый Структура("МножественныйВыбор", Истина); ОткрытьФорму( "Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, Элементы.Материалы ); КонецПроцедуры

Обработчик события ОбработкаВыбора:

&НаКлиенте Процедура МатериалыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) Для Каждого ВыбранныйЭлемент Из ВыбранноеЗначение Цикл НоваяСтрока = Объект.Материалы.Добавить(); НоваяСтрока.Материал = ВыбранныйЭлемент; КонецЦикла; КонецПроцедуры

Множественный подбор с использованием множественного выбора

Последний способ подбора сочетает в себе оба рассмотренных ранее способа. Мы будем отмечать сразу несколько элементов справочника и подбирать их в документ без закрытия формы выбора. Затем снова отмечать несколько элементов справочника и подбирать их в документ. Для этого нам будет необходимо при открытии формы выбора установить оба параметра: ЗакрыватьПриВыборе и МножественныйВыбор.

Обработчик команды Подбор:

&НаКлиенте Процедура МножественныйВыборБезЗакрытияФормы(Команда) // Позволяем выделить и выбрать несколько элементов несколько раз; в // обработчик ОбработкаВыбора() передается массив элементов; после // каждого выбора форма не закрывается ПараметрыФормы = Новый Структура( "ЗакрыватьПриВыборе,МножественныйВыбор", Ложь, Истина ); ОткрытьФорму( "Справочник.Номенклатура.ФормаВыбора", ПараметрыФормы, Элементы.Материалы ); КонецПроцедуры

Обработчик события ОбработкаВыбора остается без изменений.

Использование метода ОповеститьОВыборе()

Метод формы ОповеститьОВыборе() используется в тех случаях, когда алгоритм формирования данных подбора сложен и кроме собственно выбора элемента справочника от пользователя требуется указание некоторой дополнительной информации. В этом случае метод ОповеститьОВыборе() вызывается тогда, когда вся необходимая информация подбора сформирована.

Метод ОповеститьОВыборе() посылает оповещение владельцу формы о выполнении выбора или подбора, передает ему выбранное значение и закрывает форму, если она открыта не в режиме множественного выбора.

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

Справка

ТабличноеПоле.ДобавитьСтроку()

ТабличноеПоле.ДобавитьСтроку()

Добавляет строку в табличное поле, аналогично выполнению команды «Добавить».

  • Если табличное поле связано с таблицей или деревом значений, метод добавляет строку в таблицу или дерево значений (аналогично соответствующим методам этих объектов).
  • Если табличное поле связано со списком объектов, хранимых в базе данных, метод начинает редактирование нового объекта этого списка. (Например, список объектов в форме списка справочника, или документа).
  • Если табличное поле связано с набором записей или табличной частью, то метод начинает редактирование новой записи. (Например, список записей в форме списка регистра сведений; табличная часть документа или справочника).

Доступность: Толстый клиент.

ДанныеФормыКоллекция.Добавить()

ДанныеФормыКоллекция.Добавить()

Добавляет элемент в конец коллекции и возвращает его в качестве результата метода. Возвращаемое значение: ДанныеФормыЭлементКоллекции.

Доступность: тонкий клиент, веб-клиент, сервер, толстый клиент, мобильное приложение(клиент), мобильное приложение(сервер).

Поиск: 1С:Предприятие • Владелец • Обработка выбора • Оповестить о выборе • Открыть форму • Управляемая форма

tokmakov.msk.ru

Табличная часть объектов 1С 8.3

В этой статье мы научимся конфигурировать табличные части объектов метаданных в 1С 8.3 (справочники, документы и т.д.). Для чего вообще нужны табличные части? Очень часто бывает, что объект метаданных должен хранить некий список однотипной информации, размер которой изначально может быть не известен. Например, у справочника «Контрагенты» это может быть список ответственных лиц контрагента, а у документа «Приход товара» это список товаров, который поступили в организацию. Для того, чтобы осуществить учет однотипной информации и необходимы табличный части.

Табличная часть документа в 1С 8.3

Наиболее часто перечисление какой-то однотипной информации реализуется в документах. Например, у нас может быть приход различного товара на склады, или продажа разного товара контрагентам.  Создать табличную часть документа можно двумя способами. Первый, в конструкторе документа: на закладке данные, во втором окне для табличных частей, где и нужно добавлять новую табличную часть при помощи кнопки «Добавить табличную часть».

Второй способ: непосредственно в окне редактирования метаданных. Для этого нужно мышкой выделить ветвь дерева документа, вызвать контекстное меню и выполнить единственную команду «Добавить»

 

Табличная часть справочника 1С 8.3

У справочников 1С также могут существовать табличные части, механизм создания которых, аналогичен механизму создания табличных частей документов (используя конструктор справочника и через окно дерева метаданных).

Колонки табличной части 1С

Само по себе создание табличной части не имеет смысла, поскольку информация должна храниться в разрезе колонок. Создать колонку можно двумя способами (как в случае справочников, так и в случае документов). Первый способ, используя конструктор документа.

Второй способ, посредством окна метаданных (нужно выделить мышкой табличную часть).

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

Количество колонок вы можете создавать практически неограниченное количество, в зависимости от вашей прикладной задачи.

Табличная часть 1С 8.3 на управляемой форме

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

Если же вы уже создали форму документа, а потом в конфигураторе сделали табличную часть (или забыли добавить табличную часть в конструкторе), то вам нужно в форме перетащить мышкой табличную часть из дерева объекта в дерево элементов.

При переносе на вопрос «Добавить колонки», отвечаем «Да» (иначе придется добавлять колонки вручную, о чем мы поговорим ниже).

После этого табличная часть со всеми колонками будет добавлена на форму.

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

У ветки табличной части в дереве Объекты управляемой формы имеются также  элементы, которые не соответствуют текущим реквизитам. Как привило, это итог по суммовым полям табличной части. Эти поля можно разместить на форме.

Также эти поля можно использовать в подвале таблицы на форме.

Для этого в палитре свойств таблицы формы необходимо установить признак Подвал.

После этого в палитре свойств нужного поля табличной части, в свойстве ПутьКДаннымПодвала указать нужное суммовое поле табличной части.

После этих настроек, в подвале нужной колонки будет сумма значений это колонки.

Продолжение статьи: программная работа с табличными частями на управляемой форме

Остальные статьи по теме конфигурирования в 1С:

Справочники в 1С 8.3

Документы в 1С 8.3

Предопределенные элементы справочников 1С

Формы справочников в 1С 8.3

Более подробно и основательно конфигурирование в 1С дается в моей книге:

Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

www.1s-up.ru

Решение задач по управляемым формам

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

Поэтому часто перед разработчиками стоит задача упростить и ускорить ввод информации в систему. Можно предложить несколько вариантов решения поставленной задачи:

  • Разработать отдельную форму для подбора товаров
  • Использовать механизм перетаскивания (Drag-and-Drop) номенклатуры в документ реализации. Например, из вспомогательной таблицы значений, в которой находится номенклатура, заказанная клиентом.

Аналогичные способы можно встретить при работе с интернет-магазинами. Пользователь набирает товары в корзину, видит их цены, остатки на складах. После этого из корзины данные переносятся в заказ покупателя. Таким образом экономится время на внесение заказа в систему.

Рассмотрим процесс создания формы подбора, а также механизм переноса отобранных позиций номенклатуры в табличную часть документа. Механизм перетаскивания номенклатуры с использованием возможностей платформы «1С:Предприятие» разберем в следующем блоке материалов.

Задача на экзамене может быть сформулирована следующим образом:

Необходимо обеспечить возможность множественного подбора номенклатурных позиций в документе РасходнаяНакладная. Подбор должен осуществляться в отдельной форме.

В форме подбора нужно выводить список номенклатурных позиций. Пользователь должен видеть остатки товаров на складах и уже подобранные товары. В отдельных колонках необходимо отображать следующие остатки:

  • Остаток на складе, указанном в документе продажи
  • Остаток на главном складе
  • Остаток на всех остальных складах.

Перенос подобранных товаров в документ реализации осуществляется при нажатии на кнопку «Перенести в документ».

Рассмотрим подробнее, как решить поставленную задачу.

Как пользователь будет выполнять подбор товаров

Прежде всего спроектируем, как будет открываться подбор из документа реализации и как будет организована форма подбора.

Для формирования документа реализации пользователь заполняет шапку документа: указывает покупателя, склад, с которого отгружаются товары. Затем пользователь переходит к заполнению табличной части. Чтобы избежать ручной работы с каждой строкой табличной части, пользователь открывает специальную форму подбора. Эта форма открывается при нажатии специальной кнопки «Открыть подбор».

В каркасной конфигурации для документа РасходнаяНакладная определим реквизит Склад (тип – СправочникСсылка.Склады).

Также в каркасной конфигурации создадим команду ОткрытьПодбор формы документа РасходнаяНакладная и разместим на форме специальную кнопку:

Рисунок 1 – Создание команды для открытия формы подбора

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

Рисунок 2 – Логика работы формы подбора

Форма подбора состоит из двух таблиц:

  • Список товаров, содержащий информацию об остатках на складах в нужных разрезах (верхняя таблица)
  • Корзина подобранных товаров (нижняя таблица).

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

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

Этапы решения задачи

Разделим задачу на отдельные этапы, которые и будем последовательно реализовывать:

  1. Создание формы подбора
  2. Отображение на форме подбора списка номенклатуры с остатками на складах
  3. Открытие формы подбора из формы документа
  4. Перенос выбранных товаров в корзину
  5. Передача подобранных товаров из корзины в табличную часть документа.

Что нужно учитывать при создании формы подбора

Создадим форму подбора для документа РасходнаяНакладная. Поскольку это вспомогательная форма, на ней не будет производиться редактирование самого документа реализации, не требуются стандартные кнопки Провести и закрыть, Записать и т.д.

Поэтому в конструкторе необходимо выбрать тип создаваемой формы – Произвольная форма. Определим имя формы – ФормаПодбора:

Рисунок 3 – Начало создания формы подбора

Как оптимальным способом отобразить на форме список товаров с остатками

На форме подбора необходимо вывести перечень номенклатуры с остатками на складах. Для отображения остатков на форме можно использовать несколько вариантов:

  • Разместить на форме таблицу значений и заполнять ее при открытии формы
  • Использовать динамический список.

С точки зрения производительности использование динамического списка для решения задачи более предпочтительно.

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

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

Поэтому для решения поставленной задачи используем динамический список.

Как правильно составить текст запроса динамического списка

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

Рисунок 4 – Создание реквизита формы подбора

Рисунок 5 – Свойства созданного реквизита формы подбора

Для хранения данных об остатках товаров в каркасной конфигурации предусмотрен регистр накопления ОстаткиНоменклатуры.

Создадим в каркасной конфигурации справочник Склады и добавим в регистр накопления ОстаткиНоменклатуры измерение Склад (тип – СправочникСсылка.Склады). Таким образом, структура регистра будет иметь следующий вид:

  • Измерение:
    • Номенклатура (тип – СправочникСсылка.Номенклатура)
    • Склад (тип – СправочникСсылка.Склады).
  • Ресурс:
    • Количество (тип – Число, 10):

Рисунок 6 – Структура регистра ОстаткиНоменклатуры

Однако данных только регистра накопления ОстаткиНоменклатуры недостаточно. Например, если товар заведен в справочнике «Номенклатура», но никогда не поступал на склад, то в регистре накопления не будет записей по этой позиции. Но в форму подбора необходимо выводить абсолютно все товары. Поэтому для получения данных необходимо использовать две таблицы: справочник Номенклатура и виртуальную таблицу Остатки регистра накопления ОстаткиНоменклатуры.

Чтобы в тексте запроса динамического списка можно было использовать несколько таблиц, в настройках динамического списка необходимо установить галочку Произвольный запрос:

Рисунок 7 – Свойства списка ПроизвольныйЗапрос

Перейдем к настройке динамического списка при помощи ссылки Открыть:

Рисунок 8 – Переход к дальнейшим настройкам динамического списка

Откроется окно настройки динамического списка с возможностью использования конструктора запроса:

Рисунок 9 – Окно настройки динамического списка

Необходимо составить текст запроса. Для получения правильного результата принципиально важно выбрать подходящий тип соединения таблиц.

Требуется выводить все номенклатурные позиции. При этом остатки выводить только для тех товаров, которые есть в наличии на складах. Поэтому в конструкторе запроса используем левое внешнее соединение. При этом левая таблица – справочник Номенклатура, правая таблица – виртуальная таблица Остатки регистра накопления ОстаткиНоменклатуры:

Рисунок 10 – Использование левого соединения в запросе

Важно разделить остатки на складах. Требуется отдельно отображать следующие остатки:

  • Остаток на складе, указанном в документе продажи
  • Остаток на главном складе
  • Остаток на всех остальных складах.

Чтобы среди элементов справочника Склады можно было выделить «Главный склад», создадим в конфигураторе предопределенный элемент справочника:

Рисунок 11 – Создание предопределенного элемента справочника «Склады»

Для разделения остатков на складах в тексте запроса используем конструкцию языка запросов ВЫБОР. В итоге получится следующий запрос динамического списка:

ВЫБРАТЬ СпрНоменклатура.Ссылка КАК Ссылка, СпрНоменклатура.ПометкаУдаления КАК ПометкаУдаления, СпрНоменклатура.Код КАК Код, СпрНоменклатура.Наименование КАК Наименование, СУММА(ВЫБОР КОГДА ОстаткиНоменклатурыОстатки.Склад = &Склад ТОГДА ОстаткиНоменклатурыОстатки.КоличествоОстаток ИНАЧЕ 0 КОНЕЦ) КАК Склад, СУММА(ВЫБОР КОГДА ОстаткиНоменклатурыОстатки.Склад = &ГлавныйСклад ТОГДА ОстаткиНоменклатурыОстатки.КоличествоОстаток ИНАЧЕ 0 КОНЕЦ) КАК ГлавныйСклад, СУММА(ВЫБОР КОГДА ОстаткиНоменклатурыОстатки.Склад = &Склад ИЛИ ОстаткиНоменклатурыОстатки.Склад = &ГлавныйСклад ТОГДА 0 ИНАЧЕ ОстаткиНоменклатурыОстатки.КоличествоОстаток КОНЕЦ) КАК ОстальныеСклады ИЗ Справочник.Номенклатура КАК СпрНоменклатура ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки ПО СпрНоменклатура.Ссылка = ОстаткиНоменклатурыОстатки.Номенклатура СГРУППИРОВАТЬ ПО СпрНоменклатура.Ссылка, СпрНоменклатура.Код, СпрНоменклатура.Наименование

Рисунок 12 – Текст запроса динамического списка

Для каждой номенклатуры в результате запроса должна выводиться только одна строка, в которой должны отображаться все остатки на складах отдельными колонками. Однако левое соединение в запросе может приводить к тому, что по одному товару может получиться несколько строк в результате запроса. Чтобы избежать дублирования номенклатуры, в тексте запроса нужно использовать группировку (ключевое слово СГРУППИРОВАТЬ).

Для идентификации складов в тексте запроса используется два параметра – Склад (это склад, указанный в документе реализации) и ГлавныйСклад. Устанавливать значение этих параметров необходимо при открытии формы подбора.

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

Перенесем динамический список на форму, при этом оставим только необходимые колонки:

Рисунок 13 – Размещение динамического списка на форме

Как создать на форме корзину выбранных товаров

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

  • Номенклатура (тип – СправочникСсылка.Номенклатура)
  • Количество (тип – Число, 10).

Рисунок 14 – Создание реквизита формы подбора Корзина

Перенесем созданную таблицу значений на форму и расположим ее под списком товаров:

Рисунок 15 – Размещение на форме таблицы значений

Таким образом, внешний вид формы подбора настроен.

Как из формы документа открыть подбор

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

Рисунок 16 – Размещение кнопки «Открыть подбор» на форме документа «Расходная накладная»

Для созданной ранее команды ОткрытьПодбор (формы документа РасходнаяНакладная) создадим клиентский обработчик. В обработчике в форму подбора будем передавать склад, на котором нужно получить остатки, после чего открывать форму подбора:

&НаКлиенте Процедура ОткрытьПодбор(Команда) ПараметрыФормы = Новый Структура("Склад", Объект.Склад); ОткрытьФорму("Документ.РасходнаяНакладная.Форма.ФормаПодбора", ПараметрыФормы, Элементы.СписокНоменклатуры, , , , , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца); КонецПроцедуры

В третьем параметре метода ОткрытьФорму указывается владелец открываемой формы. Владельцем формы подбора назначаем элемент управления – таблицу СписокНоменклатуры на форме. В дальнейшем именно владельцу формы будет отправлено оповещение о выполнении подбора. Значит, именно для владельца формы (таблицы СписокНоменклатуры) в дальнейшем необходимо будет создать обработчик, в котором и выполнить заполнение табличной части подобранными товарами.

Теперь в форме подбора нужно обработать переданный параметр и установить значения параметров динамического списка.

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

Установка параметра динамического списка может выполняться только на сервере, поэтому создаем обработчик события ПриСозданииНаСервере:

&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Список.Параметры.УстановитьЗначениеПараметра("Склад", Параметры.Склад); Список.Параметры.УстановитьЗначениеПараметра("ГлавныйСклад", Справочники.Склады.ГлавныйСклад); КонецПроцедуры

Для проверки работоспособности кода в каркасной конфигурации в справочнике «Склады» в пользовательском режиме добавим несколько элементов. Обеспечим проведение документа ПриходнаяНакладная по регистру накопления ОстаткиНоменклатуры и оприходуем несколько товаров на разные склады. Предварительно в документе ПриходнаяНакладная необходимо добавить реквизит Склад (тип – СправочникСсылка.Склады):

Рисунок 17 – Форма подбора

Форма подбора корректно открывается, на форме отображается список товаров с остатками на различных складах.

Как реализовать работу с корзиной

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

&НаКлиенте Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; НайденныеСтроки = Корзина.НайтиСтроки(Новый Структура("Номенклатура", ВыбраннаяСтрока)); Если НайденныеСтроки.Количество() > 0 Тогда НайденныеСтроки[0].Количество = НайденныеСтроки[0].Количество + 1; Иначе НоваяСтрока = Корзина.Добавить(); НоваяСтрока.Номенклатура = ВыбраннаяСтрока; НоваяСтрока.Количество = 1; КонецЕсли; КонецПроцедуры

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

В приведенном коде ВыбраннаяСтрока – это и есть элемент справочника Номенклатура, по которому был совершен двойной щелчок мышью. Проверяем, есть ли указанная номенклатура уже в корзине. Если такой номенклатуры в корзине нет, то добавляем в корзину новую строку, количество указываем равным 1. Если же такая номенклатура уже находится в корзине, то увеличиваем подобранное количество на 1.

Проверим работоспособность формы подбора в пользовательском режиме. Если в списке товаров дважды выбрать одну и ту же позицию, то в корзине будут отображаться 2 штуки этого товара:

Рисунок 18 – Заполнение корзины в форме подбора

Как перенести выбранные товары из корзины в документ

Когда пользователь подобрал в корзину все необходимые товары, необходимо перенести их в табличную часть документа реализации.

Для этого создадим команду формы подбора Перенести в документ, на форме подбора разместим соответствующую кнопку:

Рисунок 19 – Создание команды формы подбора «Перенести в документ»

Рисунок 20 – Размещение команды на форме

Рассмотрим два варианта передачи информации из формы подбора в форму документа.

Первый вариант – непосредственная передача. В форме документа можно создать таблицу значений, где будут размещаться данные о подобранных товарах. Форма подбора будет помещать данные в таблицу значений на форме документа:

Рисунок 21 – Схема работы формы подбора

Однако при этом осуществляется избыточное хранение данных. К тому же при передаче управления с Клиента на Сервер придется передавать эти дополнительные данные.

Оптимальнее было бы создать некое общее хранилище информации, куда форма подбора поместит данные, а форма документа сможет получить к ним доступ. В таком случае уменьшится объем передаваемых данных.

В платформе «1С:Предприятие» существует механизм временных хранилищ – специальных объектов, куда можно поместить данные при клиент-серверном взаимодействии.

Взаимодействие будет производиться следующим образом. Форма подбора будет помещать информацию о выбранных пользователем товарах во временное хранилище. В форму документа будет передан только адрес во временном хранилище, а не весь объем данных. При обращении по этому адресу форма документа сможет получить доступ к данным о подобранных товарах и выполнить обработку этих данных:

Рисунок 22 – Использование временного хранилища

Поэтому при решении задачи будем использовать временное хранилище.

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

Код обработчика для команды ПеренестиВДокумент:

&НаКлиенте Процедура ПеренестиВДокумент(Команда) Адрес = ПоместитьТоварыИзКорзиныВоВременноеХранилище(); ОповеститьОВыборе(Адрес); КонецПроцедуры &НаСервере Функция ПоместитьТоварыИзКорзиныВоВременноеХранилище() Возврат ПоместитьВоВременноеХранилище(Корзина.Выгрузить()); КонецФункции

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

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

Владельцем формы подбора является таблица СписокНоменклатуры на форме документа РасходнаяНакладная. Именно этому элементу управления отправляется оповещение о выполнении подбора. Значит, именно для него требуется создать обработчик события ОбработкаВыбора, в котором выполнить заполнение табличной части подобранными товарами. Код процедуры СписокНоменклатурыОбработкаВыбора:

&НаКлиенте Процедура СписокНоменклатурыОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка) ОбработатьПодборНаСервере(ВыбранноеЗначение); КонецПроцедуры &НаСервере Процедура ОбработатьПодборНаСервере(АдресВременногоХранилища) Объект.СписокНоменклатуры.Загрузить(ПолучитьИзВременногоХранилища(АдресВременногоХранилища)); КонецПроцедуры

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

Проверим работу программного кода в пользовательском режиме. Создадим новый документ РасходнаяНакладная. Заполним шапку документа, укажем, с какого склада будет выполняться отгрузка. Откроем форму подбора. В ней отображаются товары, для которых указывается остаток на выбранном складе. Наберем в корзину требуемый товар:

Рисунок 23 – Форма подбора с заполненной корзиной

При нажатии на кнопку «Перенести в документ» выбранные позиции загружаются в документ РасходнаяНакладная:

Рисунок 24 – Подобранные товары в табличной части документа «Расходная накладная»

Итак, поставленная задача выполнена.

Перейти к следующей теме:
“Как в управляемых формах организовать обработку перетаскивания объектов при помощи мыши” (№ 11)

xn----1-bedvffifm4g.xn--p1ai

Программная обработка табличных частей 1С 8.3

В предыдущей статье мы узнали, как настраивать и конфигурировать табличные части объектов 1С 8.3. В этой статье мы изучим некоторые вопросы программной работы с табличными частями 1С.

Заполнение табличной части 1С 8.3

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

Поскольку по условиям задачи, необходимо отобрать всю не помеченную на удаление номенклатуру, то оптимально это сделать при помощи запроса, в котором я буду получать все не помеченные элементы справочника номенклатура. Я создал команду, при выполнении которой будет заполняться табличная часть, и разместил её на форме.

Исполнение команды будет выполняться в серверном контексте, поскольку объект Запрос не работает в клиентском контексте на тонком клиенте.

&НаСервере
 Процедура ЗаполнитьТоварамиНаСервере()
 
 Запрос = Новый Запрос;
 Запрос.Текст = "ВЫБРАТЬ
 | Товары.Ссылка КАК Товар,
 | 1 КАК Количество
 |ИЗ
 | Справочник.Товары КАК Товары
 |ГДЕ
 | НЕ Товары.ПометкаУдаления";
 Выборка = Запрос.Выполнить().Выбрать();
 Пока Выборка.Следующий() Цикл
 НовСтр = Объект.СписокТоваров.Добавить();
 ЗаполнитьЗначенияСвойств(НовСтр,Выборка);
 КонецЦикла;
 
 КонецПроцедуры
 
 &НаКлиенте
 Процедура ЗаполнитьТоварами(Команда)
 ЗаполнитьТоварамиНаСервере();
 КонецПроцедуры
 
 

При обходе запроса, я использую метод Добавить табличной части объекта (вообще это метод объекта, который имеет тип ДанныйФормыКоллекция, именно в этот тип преобразуется табличная часть документа-объекта, при создании на сервере). Данный метод является функцией, которая создаёт и возвращает новую строку.

Обратите внимание, поскольку при обходе запроса и заполнения новой строки, я использую метод ЗаполнитьЗначенияСвойств, то поля в запросе должны называться так же, как и поля табличной части.

Очистка табличной части документа 1С 8.3

Если  мы реализуем данный код, то он будет не совсем корректен: каждый раз при выполнении этого кода будут добавляться новые строки, а вполне возможно, что пользователю старые строки не нужны. Поэтому, будем очищать имеющиеся строки,  перед добавлением новых строк. Для этого воспользуемся методом Очистить объекта СписокТоваров, который имеет тип  ДанныйФормыКоллекция.

Объект.СписокТоваров.Очистить();
 

После выполнения этого метода вся табличная часть будет очищена.

Текущая строка табличной части 1С 8.3

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

Например, может возникать ситуация, что мы редактируем какое-нибудь поле текущей строки таблицы на форме, и нам нужно, чтобы было пересчитано другое поле  (или несколько полей) этой текущей строки. Например, мы изменяем цену (или количество) нашей табличной части, и необходимо, чтобы сумма автоматически была пересчитана.

Для решения данной задачи нужно воспользоваться свойством ТекущиеДанные элемента с типом ТаблицаФормы, который соответствует нужной табличной части. Свойство ТекущиеДанные возвращает значение полей текущей строки.

Для того, чтобы отработать изменение текущего поля цены, создадим обработчик события ПриИзменении этого поля.

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

&НаКлиенте
 Процедура СписокТоваровЦенаПриИзменении(Элемент)
 ТекДанные = Элементы.СписокТоваров.ТекущиеДанные;
 Если ТекДанные = Неопределено Тогда
 Возврат; //если пустая таблица
 КонецЕсли;
 ТекДанные.Сумма = ТекДанные.Количество * ТекДанные.Цена;
 КонецПроцедуры
 

Ещё пример: я создал команду, которая должна увеличивать количество в текущий строке табличной части в два раза и пересчитывать сумму. Эта команда размещена в командной панели таблицы и имеет следующий код:

&НаКлиенте
 Процедура УмножитьНа2(Команда)
 ТекДанные = Элементы.СписокТоваров.ТекущиеДанные;
 Если ТекДанные = Неопределено Тогда
 Возврат; //если пустая таблица
 КонецЕсли;
 ТекДанные.Количество = ТекДанные.Количество * 2;
 ТекДанные.Сумма = ТекДанные.Количество * ТекДанные.Цена;
 КонецПроцедуры
 
 

Теперь доработаем этот пример: после увеличения текущей строки будем сдвигать текущую строку на строку вниз. Для этого допишем предыдущий код:

Идентификтор = Элементы.СписокТоваров.ТекущаяСтрока;
 ИдентификторСлед = Идентификтор + 1;
 
 Если ИдентификторСлед < Объект.СписокТоваров.Количество() Тогда
 Элементы.СписокТоваров.ТекущаяСтрока = ИдентификторСлед;
 КонецЕсли;
 
 

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

Также при помощи текущей строки можно находить аналогичную строку в соответствующей табличной части основного реквизита формы Объект, которую также можно изменять (строка на форме тоже изменится автоматически). Мы ранее сделали пересчет суммы при изменении цены, теперь сделаем пересчет суммы при изменении количества, но напрямую через реквизит Объект.

&НаКлиенте
 Процедура СписокТоваровКоличествоПриИзменении(Элемент)
 Идентификтор = Элементы.СписокТоваров.ТекущаяСтрока;
 Если Идентификтор = Неопределено Тогда
 Возврат;
 КонецЕсли;
 ТекСтрока = Объект.СписокТоваров.НайтиПоИдентификатору(Идентификтор);
 Если ТекСтрока = Неопределено Тогда
 Возврат;
 КонецЕсли;
 ТекСтрока.Сумма = ТекСтрока.Цена * ТекСтрока.Количество;
 КонецПроцедуры
 
 

В этом коде мы используем метод НайтиПоИдентификатору переменной Объект.СписокТоваров, которая имеет типа ДанныйФормыКоллекция, этот метод получает элемент коллекции по указанному идентификатору. Если этот элемент найден, то мы можем с ними работать, причем данные на форме изменяться автоматически.

Обход табличной части 1С

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

&НаКлиенте
 Процедура УмножитьВсеНа2(Команда)
 
 ТабОбх = Объект.СписокТоваров;
 Для Каждого стрТабл из ТабОбх Цикл
 стрТабл.Количество = стрТабл.Количество * 2;
 стрТабл.Сумма = стрТабл.Цена * стрТабл.Количество;
 КонецЦикла;
 
 КонецПроцедуры
 
 

Остальные статьи по теме конфигурирования в 1С:

Конфигурирование табличный частей объектов 1С

Справочники в 1С 8.3

Документы в 1С 8.3

Предопределенные элементы справочников 1С

Формы справочников в 1С 8.3

Более подробно и основательно конфигурирование в 1С дается в моей книге:

Книга «Программировать в 1С за 11 шагов»

Изучайте программирование в 1С в месте с моей книги «Программировать в 1С за 11 шагов»

  1. Книга написана понятным и простым языком — для новичка.
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Научитесь понимать архитектуру 1С;
  4. Станете писать код на языке 1С;
  5. Освоите основные приемы программирования;
  6. Закрепите полученные знания при помощи задачника;

О том как разрабатывать под управляемым приложением 1С, читайте в книге Книга «Основы разработки в 1С: Такси»

Отличное пособие по разработке в управляемом приложении 1С, как для начинающих разработчиков, так и для опытных программистов.

  1. Очень доступный и понятный язык изложения
  2. Книга посылается на электронную почту в формате PDF. Можно открыть на любом устройстве!
  3. Поймете идеологию управляемого приложения 1С
  4. Узнаете, как разрабатывать управляемое приложение;
  5. Научитесь разрабатывать управляемые формы 1С;
  6. Сможете работать с основными и нужными элементами управляемых форм
  7. Программирование под управляемым приложением станет понятным

Промо-код на скидку в 15% — 48PVXHeYu

Вступайте в мои группы:

Вконтакте: https://vk.com/1c_prosto
Фейсбуке: https://www.facebook.com/groups/922972144448119/
ОК: http://ok.ru/group/52970839015518
Твиттер: https://twitter.com/signum2009

www.1s-up.ru

Работа с табличной частью объектов в 1С

Табличные части существуют у многих объектов в 1С:

  • Справочники
  • Документы
  • Отчеты и обработки
  • Планы счетов
  • Планы видов характеристик
  • Планы видов расчета
  • Бизнес-процессы и задачи

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

Рассмотрим некоторые приемы работы с табличными частями.

Как обойти табличную часть

Для обхода табличной части можно использовать цикл Для каждого

Для каждого Строка из ТабличнаяЧасть Цикл

Сообщить(Строка.РеквизитТабличнойЧасти);

КонецЦикла;

На каждой итерации в переменную Строка передается очередная строка табличной части. Значения реквизитов строки можно получить выражением Строка.ИмяРеквизита.

Как получить и обойти выделенные строки табличной части

Для вывода информации из табличной части объекта служит элемент формы Табличное поле. Для включения возможности выделения нескольких строк на табличном поле нужно установить значение Множественный у его свойства Режим выделения.

Для получения перечня выделенных строк используется следующий код:

ВыделенныеСтроки=ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки;

Для того чтобы обойти выделенные строки используется цикл Для каждого:

ВыделенныеСтроки=ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки;

Для каждого Строка из ВыделенныеСтроки Цикл

//содержимое цикла

КонецЦикла;

Как программно выделить строки табличной части (табличного поля) и снять выделение

Чтобы программно снять выделение строк табличного поля:

ЭлементыФормы.ИмяТабличногоПоля.ВыделенныйСтроки.Очистить();

Чтобы программно выделить все строки табличного поля:

 Для каждого ТекущаяСтрока Из ТабличнаяЧасть Цикл
ЭлементыФормы.ИмяТабличногоПоля.ВыделенныеСтроки.Добавить(ТекущаяСтрока);
КонецЦикла;

Как очистить табличную часть

ТабличнаяЧасть.Очистить();

Как получить текущую строку табличной части

Текущая строка — это срока, в которой у пользователя в данный момент находится курсор. Чтобы ее получить, нужно обратиться к элементу управления на форме, который связан с табличной частью.

Для обычных форм код будет выглядеть так:

ЭлементыФормы.ИмяТабличногоПоля.ТекущиеДанные;

Для управляемых форм:

Элементы.ИмяТабличногоПоля.ТекущиеДанные;

Как добавить новую строку в табличную часть

Добавление новой строки в конец табличной части:

НоваяСтрока=ТабличнаяЧасть.Добавить();
НоваяСтрока.Реквизит1="Значение";

Добавление новой строки в любое место табличной части (последующие строки будут сдвинуты):

НоваяСтрока=ТабличнаяЧасть.Вставить(Индекс)
//Индекс - номер добавляемой строки. Нумерация строк начинается с нуля.

НоваяСтрока.Реквизит1="Значение";

Как программно заполнить реквизиты строки табличной части

Если нужно программно заполнить реквизиты строки табличной части, которую добавляет пользователь, необходимо использовать обработчик события табличной части ПриНачалеРедактирования.

Создаваемая обработчиком процедура имеет три параметра:

  • Элемент — содержит элемент управления ТабличноеПоле.
  • НоваяСтрока — булево. Содержит значение Истина, если добавляется новая строка табличной части, и Ложь, если пользователь начал редактировать уже существующую строку.
  • Копирование — булево. Содержит значение Истина, если пользователь копирует строку, и Ложь в остальных случаях.

Рассмотрим пример. Допустим, нам нужно заполнить реквизит табличной части СчетУчета, в случае, когда добавляется новая строка. При редактировании существующей строки изменять счет учета не нужно.

Процедура ТабличнаяЧастьПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

//Если пользователь редактирует существующую строку, то ничего не делаем
Если НЕ НоваяСтрока Тогда
Возврат;
КонецЕсли;

//Если же строка новая, устанавливаем счет учета
ТекСтрока = Элемент.ТекущиеДанные; //Получили текущую строку табличной части
ТекСтрока.СчетУчета = ПланыСчетов.Хозрасчетый.НужныйСчетУчета;
КонецПроцедуры

 

chel1c.ru


Смотрите также