Решил модифицировать список номенклатуры для удобства работы, чтобы можно было видеть аналоги номенклатуры и картинки прикрепленные к номенклатуре, на одной общей форме. Для начала, перенес список номенклатуры в расширение. Добавил на форму ниже "Списка" номенклатуры вывод "Аналогов" номенклатуры (как дин. список). Связал по ключевому полю через УстановитьЗначениеПараметра дин. списка. Пока все работает нормально, при выборе в "Списке" номенклатуры ниже в "Аналогах" отображаются аналоги. Решил добавить еще на форму вывод картинок слева на форме. Добавил страницу и создал там поле ввода с видом "Поле картинки". Количество картинок генерируется автоматически по наличию вложенных картинок текущего элемента списка. и вот тут начитается полная чехарда, после заполнения картинок, пропадает содержимое основного дин. списка "Список". Заметил по отладчику, при заполнении картинок постоянно обновляется основной дин. списка "Список". В общем не могу понять почему постоянно при заполнение картинок срабатывает событие "СписокПриАктивизацииСтрокиПосле". Может кто сталкивался с таким поведением? Почему так происходит или как правильно выводить картинки? И к тому же постоянно теряется фокус текущей строки в дин. списке "Список".
У нас здесь своя атмосфера...
Группа: Основатель
Сообщений: 14050
Из: Киев
Спасибо сказали: 4613 раз
Рейтинг: 3750.1
Цитата(Andry.Boris @ 31.08.22, 18:05)
Заметил по отладчику, при заполнении картинок постоянно обновляется основной дин. списка "Список"
Предполагаю, что вот эти все заполнения вы начинаете выполнять в обработчике события ПриАктивацииСтроки. Если так, то в нем нельзя делать вызовов к процедурам/функциям с директивой НаСервере. "Нельзя" не означает, что это невозможно сделать, это означает, что могут быть какие-то неизвестные последствия. Возможно то, что вы наблюдаете, одно из таких последствий.
Ну как бы так и есть, на событие СписокПриАктивизацииСтрокиПосле идет обращение к процедурам НаСервере А как по другому реализовать отбор и заполнение? На самом НаКлиенте все не получиться реализовать... процедура УстановитьЗначениеПараметра доступна только на сервере...
В таком случае нужно вызывать код не напрямую, а через ПодключитьОбработчикОжидания с задержкой в 0.1 секунды. В большинстве случаев это помогает. В типовой на упр. формах должно быть полно примеров такого
Спасибо всем за подсказки. Разобрался немного. Убрал серверные вызовы. Перенес все на клиента. Подключил ПодключитьОбработчикОжидания. Теперь все летает и не виснет. Код привожу ниже, может кому пригодиться
Единственное, что настораживает это двойной вызов процедуры ОформлениеФормы если есть изображения для вывода. Если нет изображений для вывода, тогда один раз вызывается.
Дополню немного статью, почему терялся фокус в таблице "Список" Ошибка была в том, что в процедуре ПолучитьПараметрыКартинок неявно использовалась переменная ТекСтрокаНоменклатуры. При передачи в процедуру, передается не само значение переменной, а ссылка указатель на переменную. Тем самым программе все равно как вы назовёте в процедуре имя принимающей переменной, по факт это у вас будет сама исходная перемененная. Ниже по коду я подсветил ошибку.
&НаКлиентеПерем [highlight]ТекСтрокаНоменклатуры[/highlight]; // [highlight]Копия - Элементы.Список.ТекущаяСтрока;[/highlight]&НаКлиентеПроцедура ОформлениеФормы()//Получаем структуру параметров наших картинок
Результат = ПолучитьПараметрыКартинок([highlight]ТекСтрокаНоменклатуры[/highlight],МаксКолвоКартинокНаФорме,ЭтаФорма.УникальныйИдентификатор);
...
&НаСервереБезКонтекстаФункция ПолучитьПараметрыКартинок([highlight]ТекНоменклатура[/highlight],МаксКолвоКартинокНаФорме,УникальныйИдентификатор)
ПараметрыКартинок = Новый Структура;
//Заполняем массив номенклатурой по которой будем проверять вложения
масНоменклатуры = Новый Массив;
масНоменклатуры.Добавить(ТекНоменклатура);
//Получаем данные аналогов
Выборка = РегистрыСведений.уатАналоги.Выбрать(Новый Структура("Номенклатура",ТекНоменклатура));
Пока Выборка.Следующий() Цикл//Если есть файлы у аналогов, добавляем в массив
масНоменклатуры.Добавить(Выборка.Аналог);
КонецЦикла;
Счетчик = 0;
Длякаждого [highlight]ТекНоменклатура[/highlight] Из масНоменклатуры Цикл
Файлы = Новый Массив;
//Получаем массив файлов вложения по каждой номенклатуре
...
@Vofka - подправь оформление пожалуйста, а то что-то не получается...
У нас здесь своя атмосфера...
Группа: Основатель
Сообщений: 14050
Из: Киев
Спасибо сказали: 4613 раз
Рейтинг: 3750.1
Andry.Boris, [ hide ] без пробелов. Я с пробелами написал, потому что не отобразится иначе в тексте. Или слева под смайликами нажмите "Спрятать", оно за вас нужный тег вставит.
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!