Всем привет. Хочется немного поделиться с вами рабочими моментами, так как оно встречается больше, чем может показаться. Повсюду. Итак, начнем.
Вариант задания 1: У вас база на ..дцать организаций, ну, например, пять-десять. Вам нужно всем поделить доступ, чтоб каждый видел документы только своей организации. И вот беда, первая мысля это RLS, но туда можно не лезть, так как включена галка в настройках Учет в целом по компании (есть главная организация) и эта компания лезет отовсюду, как в каждой бочке затычка. При отборе и при создании.
Решение - немного доработать справочник. Вариантов несколько с алгоритмами работы. Проверить, есть ли ограничения. У каждого пользователя добавить свой список организаций. Если нет ограничений, то доступ на базу полный, а иначе даем запрос к справочнику как раз на свои созданные реквизиты, получаем список значений. Метод лучше вынести в общий модуль как экспортный. Это будет наш отбор.
Ну а далее для каждого документа в формах списка мы скрываем типовой элемент отбора по организации и вставляем свой отбор.
Для отбора есть ОбщегоНазначенияКлиентСервер.УстановитьОтборДинамическогоСписка()
Вот пример из типовой конфигурации в форме списка документа АвансовыйОтчет:
ОбщегоНазначенияКлиентСервер.УстановитьЭлементОтбораДинамическогоСписка(
Список, "Валюта", Валюта, ВидСравненияКомпоновкиДанных.Равно,, ЗначениеЗаполнено(Валюта));
Выше приведен пример с валютой, аналогично можно поступить с отбором по организации. Третий параметр как раз можно заменить своим отбором, будь он хоть список значений, полученный из запроса.
Аналогично тот же список значений можно использовать в формах документа Обработчик Начало выбора. Но тут уж с параметрами выбора код кидать не буду. Оно гуглится в интернете.
И так с каждым документом в форме списка и в форме документа, с которыми необходимо ограничить доступ. Разработка по идее в целом небольшая, только кому-то, наверное, будет муторно перебирать все документы и журналы документов. Спасибо механизму расширений, что теперь хоть не нужно типовые снимать с замка.
Вариант задания 2. Вас просят сделать что-то в обработке, чтобы там был список. Бьетесь фэйсом об тэйбл? Не нужно! В обработке в основном форма объекта, и создать через реквизиты (данные) очередной реквизит с типом динамический список - номер не пройдет. У вас он будет недоступен в данных формы.
Создавайте как реквизит формы и играйтесь аналогично с данным списком.

Думаю, как залезть в список, пояснять не надо. Залезли в список, сделали нужный запрос, если все норм, вынесли на форму со всеми колонками.
Вариант задания 3. Программное создание и проведение документа. Вы из формы одного типового документа и создаете другой новый документ, и проводите. Но вот беда, статус проведен, а движений нет?! Знакомо?
Если распровести и снова провести, то вылезет ошибка пересчета. Хоть поле Количество и заполнено. Вроде мы все реквизиты и прочее скопировали, заполнили, но не катит.
Решение 1. Обязательно нужно при создании нового документа вызывать обработчик заполнения, а потом уже заполнять реквизиты.
Я, например, делаю калькуляцию из формы заказа клиента:
НовыйДок = Документы.ПлановаяКалькуляция2_2.СоздатьДокумент();
НовыйДок.Заполнить(ИсточникЗаполнения);
...
НовыйДок.Записать(РежимЗаписиДокумента.Проведение);
Источник чаще всего это ДанныеЗаполнения, но это в модуле объекта, а в модуле формы это чаще всего Объект или ЭтотОбъект.
Но вот беда, и этого может быть недостаточно. А вы распроведите док и проведите заново, авось и вылезет, где песик порылся.
У меня вылезла ошибка с количеством. Оно, оказывается, нулевое? Да с чего ли? Оказывается, есть клиентские обработчики пересчета упаковок и количества, которые срабатывают при интерактивном обращении. То есть введите вы заново данные в ТЧ документа и вуаля, все будет норм. Но нам нужно, чтобы программно док создавался, пока не получается.
&НаКлиенте
Процедура ОбъектыКалькуляцииУпаковкаПриИзменении(Элемент)
ТекущаяСтрока = Элементы.ОбъектыКалькуляции.ТекущиеДанные;
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьКоличествоЕдиниц");
ПакетнаяОбработкаТабличнойЧастиКлиент.ОбработатьСтрокуТЧ(ТекущаяСтрока, СтруктураДействий, КэшированныеЗначения);
КонецПроцедуры
Вот оно, вроде, решение проблемы?! Но нет. Мы же создаем док на сервере и не можем стучаться на клиент, как обычно с клиента на сервер(
Кто-то заблудится с отладчиком в БСП как в темном лесу, но если порыться повнимательнее, в процессе найдете..
Если ТребуетсяСервер Тогда
...
Идем дальше, вуаля, есть аналогично серверные методы.
В итоге проблема решилась так. До записи документа вводим в процессе:
СтруктураДействий = Новый Структура;
СтруктураДействий.Вставить("ПересчитатьКоличествоУпаковок", Истина);
ПакетнаяОбработкаТабличнойЧастиКлиентСервер.ПересчитатьКоличествоУпаковокВСтрокеТЧ(НоваяСтрока,
СтруктураДействий, КэшированныеЗначения);
Сейчас кто-то закричит, но это же обработчики табличных частей! да! Потому что в типовой оно оттуда и вызывается и с ними работает. НО никто не мешает заменить переменные.
ВЫ уже в форме документа при работе с ТЧ обработаете данные и создадите док новый ток в цикле.
Итого, вместо текущей строки - ваша строка из цикла, структура действий - ставим в истину силком, иначе оно даст ложь и не сработает. Там каждый метод со своей структурой действий. Кэшированные значения можно объявить как переменную в начале процедуры. Аналогично оно и в типовых делается
Перем КэшированныеЗначения;
Переменная кэшированные значения, ваша структура действий и ваша строка из цикла. У меня получилось. Из заказа клиента моя плановая калькуляция провелась как надо, движения появились)
Варианты заданий буду потихоньку дополнять, если встретится что еще)))
Показано на конфигурации 1С:ERP Управление предприятием 2 (2.5.22.103). Платформа 1С:Предприятие 8.3 (8.3.27.1989).
С уважением, когда-то затюканный юзер форума. Благо сейчас меня никто уже не трогает))))
Вступайте в нашу телеграмм-группу Инфостарт