Добавить реквизит на форму списка и заполнить
Обычные формы. УПП. Нужно добавить на форму списка документа реквизит (тип "строка") и заполнять его данными из разных строковых реквизитов тч этого же документа.
(Выборку данных для выведение в реквизит формы списка сделал)
Вопрос: как производить заполнение такого реквизита? В какой момент? Посоветуйте варианты решения. Возможно ли это?
P.S. Создать реквизит документа, заполнять его нужными данными при записи, а потом просто вывести на форму списка - не вариант. Так как нужна данная "доработка" и для документов из закрытого периода.
P.S.S. Да, задача "немного не очень", но не я ее постановщик.
(Выборку данных для выведение в реквизит формы списка сделал)
Вопрос: как производить заполнение такого реквизита? В какой момент? Посоветуйте варианты решения. Возможно ли это?
P.S. Создать реквизит документа, заполнять его нужными данными при записи, а потом просто вывести на форму списка - не вариант. Так как нужна данная "доработка" и для документов из закрытого периода.
P.S.S. Да, задача "немного не очень", но не я ее постановщик.
По теме из базы знаний
- Управление состоянием формы через конечный автомат
- Доработка стандартной консоли запросов с ИТС (для 8.2, обычные формы) для возможности получения данных запросом из внешних файлов (.xls, .xlsx, .mxl)
- Множественные дополнительные реквизиты в УТ 11.5 (11.4)
- Подсветка недействительных пользователей в форме "Группа доступа"
- Использование типовой общей формы отчета для нетиповых отчетов
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)В Форме списка в обработке события "При получении данных" можно заполнить добавленный на форму реквизит
Еще можно в обработке события "При выводе строки" - но это будет медленее работать
Процедура ДокументСписокПриПолученииДанных(Элемент, ОформленияСтрок)
//тут можно добавить проверку на видимость добавленной вами колонки и елси она не отображается, то не выполнять доп обработку
Соответствие = Новый Соответствие;
СсылкиМассив = Новый Массив;
Для каждого Стр Из ОформленияСтрок Цикл
// тут получаете выводимые строки, в простейших случаях можно сразу устанвоить необходимое значение реквизита или оформление
СсылкиМассив.Добавить(Стр.ДанныеСтроки.Ссылка);
Соответствие.Вставить(Стр.ДанныеСтроки.Ссылка,Стр);
КонецЦикла;
// тут определяете какие ссылки списка обрабатывать и получаете данные которые хотите вывести
Пока Выборка.Следующий() Цикл
ТекСтр = Соответствие.Получить(Выборка.Ссылка);
Если ТекСтр <> Неопределено Тогда
ТекСтр.Ячейки.<ИмяДобавленнойКолонки>.ОтображатьТекст = Истина;
ТекСтр.Ячейки.<ИмяДобавленнойКолонки>.Текст = Выборка.Коментарий;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
ПоказатьЕще можно в обработке события "При выводе строки" - но это будет медленее работать
Всем, кто предложил делать "через вывод или оформление": человек же сказал: нужен РЕКВИЗИТ
(1)
возможно, в дальнейшем по нему нужен будет поиск, а оформление не позволит этого сделать...
через оформление можно выводить лишь одноразовые уточняющие данные - увидел - и забыл
И так, что делать?
1. добавляем реквизит, допустим, Описание
2. добавляем процедуру в модуль объекта, допустим, ОбновитьОписание, где описываем правило его заполнения, (обязательно ставим в конце Экспорт - после выполнения нашей процедуры ниже это слово можно удалить). Так же можно просто содержимое перенести в обработку, и не использовать вызов этой процедуры, а саму процедуру расположить в модуле формы:
3. вешаем вызов процедуры на процедуру ПриИзменении каждого реквизита-донора (который влияет на его значение)
это даст возможность оперативно (во время редактирования документа видеть изменение нашего реквизита при изменении влияющих на него данных), изменение самого этого реквизита в документе лучше заблокировать, чтобы не иметь "сюрпризов", если кто-то его сотрёт или внесёт значение, не вписывающееся в его предназначение:
ТолькоПросмотр = Истина или Доступность = Ложь
4. далее, делаем и запускаем обработку, которая пробегается по старым документам и заполняет этот реквизит (напоминаю, вместо ДокОбъект.ОбновитьОписание() можно скопировать содержимое этой процедуры прямо в код обработки:
5. Необязательный пункт (только, если предполагается изменение влияющих реквизитов через другие модули/обработки, скажем, изменяющие договор, который в нашем примере влияет на содержимое нашего реквизита. Тогда в модуле объекта добавляем:
Профит.
(1)
заполнять его данными из разных строковых реквизитов тч этого же документа
возможно, в дальнейшем по нему нужен будет поиск, а оформление не позволит этого сделать...
через оформление можно выводить лишь одноразовые уточняющие данные - увидел - и забыл
И так, что делать?
1. добавляем реквизит, допустим, Описание
2. добавляем процедуру в модуль объекта, допустим, ОбновитьОписание, где описываем правило его заполнения, (обязательно ставим в конце Экспорт - после выполнения нашей процедуры ниже это слово можно удалить). Так же можно просто содержимое перенести в обработку, и не использовать вызов этой процедуры, а саму процедуру расположить в модуле формы:
Процедура ОбновитьОписание() Экспорт
Описание = Организация + ": " + Контрагент + " ( " + Договор + ")"; // это как пример
КонецПроцедуры
3. вешаем вызов процедуры на процедуру ПриИзменении каждого реквизита-донора (который влияет на его значение)
это даст возможность оперативно (во время редактирования документа видеть изменение нашего реквизита при изменении влияющих на него данных), изменение самого этого реквизита в документе лучше заблокировать, чтобы не иметь "сюрпризов", если кто-то его сотрёт или внесёт значение, не вписывающееся в его предназначение:
ТолькоПросмотр = Истина или Доступность = Ложь
4. далее, делаем и запускаем обработку, которая пробегается по старым документам и заполняет этот реквизит (напоминаю, вместо ДокОбъект.ОбновитьОписание() можно скопировать содержимое этой процедуры прямо в код обработки:
Запрос = Новый Запрос("ВЫБРАТЬ Документ.НашДокумент.Ссылка ГДЕ Дата < &Дата");
Запрос.УстановитьПараметр("Дата", ТекущаяДата());
Док = Запрос.Выполнить().Выбрать();
Пока Док.Следующий() Цикл
ДокОбъект = Док.Ссылка.ПолучитьОбъект();
ДокОбъект.ОбменДанными.Загрузка = Истина;
ДокОбъект.ОбновитьОписание();
ДокОбъект.Записать();
КонецЦикла;
Показать5. Необязательный пункт (только, если предполагается изменение влияющих реквизитов через другие модули/обработки, скажем, изменяющие договор, который в нашем примере влияет на содержимое нашего реквизита. Тогда в модуле объекта добавляем:
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
ОбновитьОписание();
КонецПроцедуры
Профит.
Что планируется еще делать с этим реквизитом на форме списка? Если просто визуально выводить - возможно проще сделать условным оформлением в процедуре списка ПриПолученииДанных не добавляя реквизит в документ.
Если же нужен именно как реквизит документа - добавить реквизит в документ, для новых документов заполнять в процедуре ПередЗаписью, для уже существующих документов заполнить обработкой в режиме ОбменДанными.Загрузка = Истина.
Если же нужен именно как реквизит документа - добавить реквизит в документ, для новых документов заполнять в процедуре ПередЗаписью, для уже существующих документов заполнить обработкой в режиме ОбменДанными.Загрузка = Истина.
(3)
ПриСозданииНаСервере реквизиты, на основании которых должен меняться "наш" реквизит, могут быть ещё пустыми
ПриОткрытии? Странное предложение... Смотрите, что получится по вашей схеме:
1. вы создали документ, наш реквизит заполнился по пустым данным - т.е. он "пустой" или "полупустой"
2. вы сделали изменения важных реквизитов, которые должны влиять на содержимое нашего реквизита - но он уже "заполнен" из п.1.
3. вы нажали записать/провести
Итак? Мне нужно теперь снова его открыть (чтобы реквизит обновился) и потом снова его записать/провести? Лолшто? А если я этого не сделаю/забуду и вообще это двойная (мусорная) нагрузка и на сервер и на человека и на журнал событий и на историю изменений
ближе всего (2), но вариант ПередЗаписью - спорный, так как он не даёт визуального изменения во время редактирования документа
однако, у него есть тот плюс, что он позволяет делать необходимые изменения при изменении документа через другие модули / обработки. в таком случае лучше использовать его вместе с процедурой обновления реквизита в самой форме
Создайте форму списка, добавьте новое поле и в процедуре ПриСозданииНаСервере или ПриОткрытии заполняйте нужными данными
ПриСозданииНаСервере реквизиты, на основании которых должен меняться "наш" реквизит, могут быть ещё пустыми
ПриОткрытии? Странное предложение... Смотрите, что получится по вашей схеме:
1. вы создали документ, наш реквизит заполнился по пустым данным - т.е. он "пустой" или "полупустой"
2. вы сделали изменения важных реквизитов, которые должны влиять на содержимое нашего реквизита - но он уже "заполнен" из п.1.
3. вы нажали записать/провести
Итак? Мне нужно теперь снова его открыть (чтобы реквизит обновился) и потом снова его записать/провести? Лолшто? А если я этого не сделаю/забуду и вообще это двойная (мусорная) нагрузка и на сервер и на человека и на журнал событий и на историю изменений
ближе всего (2), но вариант ПередЗаписью - спорный, так как он не даёт визуального изменения во время редактирования документа
однако, у него есть тот плюс, что он позволяет делать необходимые изменения при изменении документа через другие модули / обработки. в таком случае лучше использовать его вместе с процедурой обновления реквизита в самой форме
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот