Как обратиться к форме списка документа 1с
Сегодня очень важная тема - Формы. В платформе 1С форма - это важный компонент, который присутствует везде.
Что такое форма?
Прежде чем отвечать на этот вопрос, давайте представим вот что. Представьте перед собой чистый лист бумаги формата А4, на котором ничего нет вообще. Этот лист - это чистая форма. чистая она до того момента пока мы на ней что-то не нарисуем.
Взяли карандаш и нарисовали на нем или написали свои ФИО - это мы начали заполнять форму, и, таким же образом продолжаем ее заполнять. Вот и в платформе почти так же.
Форма - это представление того, как будет отображаться все, что вы поместите на форму, то есть какие изменения будете вносить на эту форму.
На форме можно помещать разнообразные элементы: поле ввода, поле вывода, кнопки, картинки, диаграммы и так далее.
В платформе 1С очень много всевозможных форм и со временем мы с ними познакомимся, но пока нам важны только две формы: "Форма элемента" и "Форма списка ".
На самом деле мы уже работали с этими формами, просто не обращали на них внимание, так как еще не знали о них ничего.
Давайте вспомним предыдущий урок, в котором мы создавали справочник и потом элементы в нем.
Откройте пользовательский режим и зайдите в справочник, который создали на прошлом занятии (Рисунок 1).
Давайте разбираться где это формы и как их отличить.
Нажмите на кнопку "Создать" и у вас откроется окно (Рисунок 2).
Посмотрите на рисунок 2, там есть маленькое окно, которое выделено красным прямоугольником. Это окно и есть Форма элемента. Почему? Потому что мы нажимаем на кнопку "Создать", а это значит мы даем команду платформе, что необходимо создать элемент, поэтому мы создаем элемент и от этого она называется формой элемента.
А где же Форма списка?
Закройте это окно и посмотрите на рисунок 3. Все, что находится в желтом прямоугольнике, это и есть форма списка. Форма списка появляется сразу, как только мы заходим в справочник. Как только нажали на справочник, так сразу же видим список всех элементов, от этого она и называется формой списка.
Хорошо, разобрались где они в пользовательском режиме, но как же они там появляются, если мы их не создавали в режиме разработчика, а только создали справочник. Как и где их найти в режиме разработчика, а самое главное - почему они сами появляются? Давайте разбираться!
Зайдем в режим разработчика и откроем наш справочник. Перейдем на вкладку "Формы" (Рисунок 4).
У справочника 5 форм, но мы пока работаем с двумя: форма элемента и форма списка.
Посмотрите на рисунок 4, здесь перечень всех возможных форм и все поля там пустые. Так откуда же формы? Это очень хороший и нужный вопрос! А ответ простой - платформа разработана таким образом, чтобы при создании справочника (объекта) мы могли сразу запустить и вести автоматизацию. Как только вы создаете какой-то объект, платформа автоматически сама добавляет к нему стандартную форму, от этого при запуске они у нас сразу и существуют!
Возникает тогда вопрос: "А зачем тогда нужна вкладка Формы, если она все сама делает?". Ответ тоже прост - платформа может делать только что-то простое, а если необходимо сделать что-то сложное, то необходимо создавать уже свою форму и работать с ней.
Здесь возникает еще один важный момент. Как только вы создаете свою форму, платформа понимает, что ее помощь уже не нужна и не создает форм, а воспринимает только ту форму, которую создали вы и указали ей.
Давайте начнем с простого и разберемся в том, почему нас может не устраивать стандартная форма?
Откройте в пользовательском режиме справочник и посмотрите на форму списка, она в виде таблички, где первый столбец - это Наименование, а второй Код (другими словами Код - это номер по порядку). Но в нашем понимании все должно быть наоборот, сначала номер, а потом перечисление. Вот и нашли причину! Нас это не устраивает. Если что-то не устраивает в отображении на стандартной форме, то необходимо создавать свою форму. Для этого переходим в режим разработчика, открываем справочник и переходим на вкладку "Формы" (Рисунок 5).
Ребят, с обычными формами не работаю, а ту пришлось. Не могу понять, как мне найти Исполнителя?
А именно, мне нужно сравнить Исполнителя в документе с текущим пользователем, и если они совпадают, тогда видимость для того документа сделать истиной, иначе ложью. Вот не получается что-то обратиться к этому исполнителю.
Скриншот формы списка приложила.
Вот что у меня пока получается:
Проверьте в отладчике:
Будет ли определено ЭлементыФормы.ДокументСписок.ТекущиеДанные.Исполнитель если колонка "исполнитель" в списке отсутствует из-за ручной настройки ?
Типы данных Исполнитель = ПараметрыСеанса.ТекущийПользователь совпадают ?
Не используйте служебное Объект для переменных, пишите напрямую
Учтите, что управляете видимостью всего списка. Это неверно.
Таким способом скрыть документ не удастся. Используйте отборы.
(2) Нет, данная конструкция не определена в отладчике.
Насчет типов - нет, не совпадают. У параметра сеанса "ТкеущийПользователь" , тип - спр.Пользователи, а у "Исполнителя - составной тип, спр.Пользователи и спр.Сотрудники.
Я предполагала, что скроется весь список документов, но туда еще не дошла, пока исполнителя не получу. Спасибо. Отборами просто не приходилось пользоваться, буду разбираться, как их установить программно.
И как же все-таки мне обратиться к этому исполнителю.
Не совсем поняла, что Вы хотели сказать: "если колонка "исполнитель" в списке отсутствует из-за ручной настройки ? "
(2) Отбор ставится таким образом??
(5) "Значение не является значением объектного типа"
Он не видит через текущие данные исполнителя. В этом то и проблема. Вопрос как раз и заключается в том, как мне найти исполнителя(
(5) И код немного поменяла. Это обычное приложение.
В каком месте написан этот код? Так-то, текущие данные не всегда определены.
(7) И отбор и видимость? Может оставить что-то одно?
А вообще странная задача. Скрыть список, если пользователь ткнул не в свой документ?
(8) Код в модуле формы списка документа в процедуре ПриОткрытии;
Через ЭлементыФормы.ДокументСписок.ТекущиеДанные не получает исполнителя, я ВСЕГДА получаю НЕОПРЕДЕЛЕНО. Вот в этом и прблема.
И отбор и видимость? Может оставить что-то одно? - смысл задачи в том, что пользователь, открыв список документов, должен увидеть ТОЛЬКО те, где он является исполнителем.
Еще момент. У параметра сеанса "ТкеущийПользователь" , тип - спр.Пользователи, а у "Исполнителя - составной тип, спр.Пользователи и спр.Сотрудники. Это же наверняка каким-то образом повлияет, правильно?
(11) Не достаточно. Он не делает отбор. Захожу под разными пользователями, все равно вижу документы других.
(14) там должно быть "Отбор.Исполнитель.ВидСравнения = ВидСравнения. Равно ;"
При НеРавно он и будет видеть только документы других.
(7) он и не найдет исполнителя, пока строка не будет активирована, при открытии формы, она у вас не активна. Получается так, что в таб части у вас может быть много исполнителей разных, если вы будите перебирать строки, то и смысл накладывать фильтр? может просто наложить фильтр по текущему пользователю? При открытии формы срабатывает ОбновлениеОтображения, там можете сделать свои действия, но я не пойму зачем бежать по списку и его фильтровать, если пользователи в таб части будут разные
Немного исправила структура и код, чтобы избежать проблему с разными типами.
Тут вы пытаетесь скрыть весь список документов. Само поле со списком.
Для чего это условие? Отбор сам по себе проверит каждую строчку. Вам вообще не нужна текущая строка. Отбор работает одинаково, хоть в ОФ, хоть в УФ, хоть в Африке. Вам не нужен доступ к полям списка, вам не нужно определять текущие данные, вам нужно просто установить отбор.
Код в модуле формы списка документа в процедуре ПриОткрытии;
Через ЭлементыФормы.ДокументСписок.ТекущиеДанные не получает исполнителя, я ВСЕГДА получаю НЕОПРЕДЕЛЕНО
Что логично в приОткрытии, ведь текущиеДанные являются текущими только если в поле списка активирована строка.
Часто требуется показать в форме списка документа итог по реквизитам табличных частей, таких как Сумма, Итого и т.п. Для этого можно завести специальные реквизиты, которые заполнять в процедуре ПередЗаписью в модуле документа. Но эту же задачу можно выполнить запросом - не выгоняя пользователей и не перепроводя все старые документы.
В качестве тестового примера возьмем конфигурацию с одним документом (ссылка на скачивание - см. ниже).
В документе ПриходнаяНакладная есть реквизиты шапки Реквизит1, Реквизит2, Реквизит3, Табличные части Тч1 и Тч2, в каждой из которых есть реквизиты Сумма и Количество.
Автоматически система генерирует запрос такого вида:
Мы изменим этот запрос так, чтобы он обращался к данным табличных частей документа:
Запрос обращается к табличным частям, которые в этом примере названы как Тч1 и Тч2.
Части запроса, которые выполняют это обращение, на картинке ниже обведены в рамку:
Чтобы изменить запрос формы списка, нужно сделать следующее:
То есть, в открытой в конфигураторе форме списка документов дважды щелкаем на реквизит «Список», открываем его свойства и там выставляем, как показано на картинке выше, флажок «ПроизвольныйЗапрос» и щелкаем на ссылку «Настройка списка».
Чтобы форма списка с измененным запросом «вела себя» как обычная форма списка документов, надо выставить реквизит «Основная таблица», для оптимизации на больших базах можно поставить галочку «Динамическое считывание данных».
Вложенный запрос можно вписать вручную по аналогии с показанным примером, либо сформировать в конструкторе запросов.
Связи вложенного запроса с основной таблицей документа:
Показанная на рисунке выше настройка связей - это то же самое, что и конструкция «ЛЕВОЕ СОЕДИНЕНИЕ … ПО» в самом тексте запроса:
Настройка псевдонимов полей производится либо на закладке Объединения/Псевдонимы
либо в тексте запроса в выражении КАК:
Размещение реквизитов на форме списка
Полученные реквизиты нужно перетащить на форму, чтобы получилось вот это:
Тестовый пример конфигурации
- Последние изменения: 12.08.2014 20:26
- — romix
За исключением случаев, когда указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: CC Attribution-Share Alike 3.0 Unported
Замысел таков: приделать код, который срабатывал бы раз в определенное время и заполнял бы таблицу определенными значениями вне зависимости от того, открыта форма или нет (то есть событие формы ПриОткрытии отпадает).
А какой смысл заполнять ТП, да ещё и не связанное ни с какими реквизитами в неоткрытой форме? Как ты себе это представляешь?
Представляю так: при открытии конфигурации код опрашивает документы и, связываясь с таблицей на форме списка, путем доступа к ее колонкам (колонки же я в таблицу завел), производит заполнение таблицы кое-какими значениями. Форму, получается, надо обязательно открыть? Что-то я не понял из мануала. Судя по тому, что напрямую достучаться не получается - или обращение неверное, или неверно представляю.
Во-первых, добавив ТабличноеПоле и создав колонки Вы уже создали Реквизит Формы (ТаблицуЗначений). И именно его/её Вам надо заполнять. НО! ЗАЧЕМ заполнять реквизит закрытой формы? Ссылку на форму Вы не сохраняете, то есть открыть её в заполненном состоянии не сможете.
ну ты даешь)) нафига заполнять через форму?) Заполняй обычным способом - получи объект, заполни табличную часть. Форма - это всего лишь интерфейсное отображение реквизитов объекта.
Дело в том, что Табличное Поле, которое я создал в Форме Списка Документа, я хочу сделать так, чтобы оно не было привязано конкретно к какому-то документу, а просто заполнялось данными из всех документов согласно условию. То есть код просматривает документы и заполняет таблицу данными, взятыми из этих документов. Если я буду получать каждый раз объект, то каждый раз у меня будет очередной документ. Именно поэтому я перебираю все документы, а так как Табличное Поле не привязано к какому-то документу конкретно, то я и обращаюсь к Форме Списка - форма-то одна, значит, и Табличное Поле будет одно. я что-то недопёр, то есть, данные, внесенные в табличное поле таким образом, не сохранятся?
В этой форме собирается нужная информация вне зависимости от того, какие другие формы открыты. Когда открываю эту форму с Табличным полем - данные уже собраны там. То есть, чтобы к открытию формы сбор данных не был бы привязан. Замысел как раз такой.
мне кажется ты как то не понятно объясняешь "не было привязано конкретно к какому-то документу, а просто заполнялось данными из всех документов согласно условию" это очень похоже на объект журнал документов
Насколько Вы представляете себе механизмы ООП? ФормаСписка - объект. Команда .ПолучитьФорму - возвращает ссылку на объект Два-три-четыре последовательных вызова этой команды вернут ссылки НА РАЗНЫЕ объекты. В Вашем варианте, ссылку на полученный объект Вы не сохраняете. Более того, при выходе из Вашей процедуры эта ссылка будет освобождена, объект в памяти уничтожен вместе с заполненной таблицей. Именно поэтому заполнение необходимо делать в момент открытия формы. Либо иметь глобальную переменную, в которой Вы сохраните ссылку на заполняемую форму и открывать форму по этой ссылке. Учтите, стандартная команда интерфейса создает свой объект ФормаСписка с Вашим никак не связанный
Реализовал по , все получилось даже лучше, чем в моем первом варианте, но тут попутно назрел другой вопрос: ТабличноеПоле с типом данных РегистрСведений не содержит никаких данных, а только отображает список РегистраСведений, который я использовал в качестве Данных Табличного поля. Возникла необходимость обратиться к текущей строке ТабличногоПоля, и тут я и получил ТекущаяСтрока = Неопределено. Смотрю в отладчике - данные из регистра в ТекущуюСтроку не падают, но ведь событие ПриВыводеСтроки в том же Табличном поле работает, то есть, как-то данные можно получить (там параметр ДанныеСтроки). Вопрос: есть ли возможность получить данные под курсором в табличном поле? Пока не могу понять, к чему обратиться, чтобы их вытащить.
ТекущиеДанные Вам в помощь. Кроме того, ТекущаяСтрока = Неопределено, если ни одна строка не выбрана.
В том-то и дело, что курсор на нужной строке стоит. Получаю данные так: ТекущаяСтрока, ТекущиеДанные - в отладчике висит "Неопределено". Может, неверно делаю, что обращаюсь через элементы формы?
Здравствуйте! Подскажите, пожалуйста, как из документа объекта обратиться к реквизиту формы этого документа? У документа Платежное поручениеИсходящее есть реквизит формы "Список". Мне нужно узнать, истина он, или ложь?
Код ( (Unknown Language)):
Док=Документы.ПлатежноеПоручениеИсходящее.Выбрать();
Пока Док.Следующий() Цикл
Если Док. Тогда
КонецЕсли;
КонецЦикла;
как можно обратиться к реквизиту справочника из модуля документа?
я пытаюсь вот таким образом: &НаКлиенте Процедура ПробегПриИзменении(Элемент).
Как обратиться к реквизиту формы документа из внешней обработки
Добрый день) Появился такой вопрос - в модуле формы обработки пишу запрос к документу(нахожу.
Как обратиться к реквизиту экранной формы в модуле документа?
Привет Всем Не подскажите как можно обратится к реквизиту многострочной части экранной формы из.
Обращение к реквизиту формы документа через внешнюю печатную форму.
Здравствуйте Есть внешняя печатная форма и документ "Договор". У документа есть на форме реквизит.
Что за конфигурация? Если открыть форму в конфигураторе, открыть свойство списка - то что написано в поле имя? Есть ли такой реквизит в документе?
Что за конфигурация? Если открыть форму в конфигураторе, открыть свойство списка - то что написано в поле имя? Есть ли такой реквизит в документе?
[/qu
Конфигурация УПП. В поле имя написано список. Такого реквизита в документе нет. Это реквизит формы.
Это влияет только лишь на отображение на форме данных. Сам принцип является неизменным. Обязательным является заполнение табличной части документа платежное поручение. Т.е. если у вас стоит галочка - данные из таблицы заполняют реквизиты на форме, если нет - то отображается сама табличная часть.
Вам надо обрабатывать количество записей в таблице документа, а не реквизит формы.
Обратите внимание на Процедуру ПриОткрытии основной формы, там даже есть кусочек кода
Если РасшифровкаПлатежа.Количество()>1 Тогда
Список = Истина;
Иначе
Список = Ложь;
КонецЕсли;
Если для вас это еще актуально, то приблизительно так:
Док=Документы.ПлатежноеПоручениеИсходящее.Выбрать();
Пока Док.Следующий() Цикл
Форма = Док.ПолучитьФорму();
СписокИзДокумента = Форма.ЭлементыФормы.Список.Значение;
// Здесь анализ содержимого реквизита "Список" через переменную СписокИзДокумента
.
КонецЦикла;
Чойта я могу ошибаться, конечно, однако мне кажется ПолучитьФорму() не запускает обработку ПриОтктытии(). Значит, как мне думается, значение реквизита "Список" будет тем, какое оно стоит по умолчанию.
Это влияет только лишь на отображение на форме данных. Сам принцип является неизменным. Обязательным является заполнение табличной части документа платежное поручение. Т.е. если у вас стоит галочка - данные из таблицы заполняют реквизиты на форме, если нет - то отображается сама табличная часть.
Вам надо обрабатывать количество записей в таблице документа, а не реквизит формы.
Обратите внимание на Процедуру ПриОткрытии основной формы, там даже есть кусочек кода
Если РасшифровкаПлатежа.Количество()>1 Тогда
Список = Истина;
Иначе
Список = Ложь;
КонецЕсли;
Спасибо, так примерно и сделала
Если для вас это еще актуально, то приблизительно так:
Док=Документы.ПлатежноеПоручениеИсходящее.Выбрать();
Пока Док.Следующий() Цикл
Форма = Док.ПолучитьФорму();
СписокИзДокумента = Форма.ЭлементыФормы.Список.Значение;
// Здесь анализ содержимого реквизита "Список" через переменную СписокИзДокумента
.
КонецЦикла;
Как обратиться с Документа1 к реквизиту Документа2?
Здравствуйте, я сделал из на основании документа1 - документ2, при этом записал в реквизит.
Как программно обратиться к процедуре в модуле формы полученного объекта?
Доброго всем. 1С Бухгалтерия 8.2. Есть документ "Отчет производства за смену". На вкладке.
Как обратиться к реквизиту справочника в модуле менеджера
Есть справочник Договоры Контрагентов в нем создан макет active document и команда. Подскажите как.
Читайте также: