Странное поведение строки программно добавленной таблицы в реквизиты формы
Добавил в форму БС_ТаблицаРазделов - таблицу значений:
Форма.БС_ТаблицаРазделов - ДанныеФормыКоллекция
Перебираю ее элементы на сервере в СтрокаРаздела через Для Каждого:
СтрокаРаздела - ДанныеФормыЭлементКоллекции
Так вот, если что-то меняю в СтрокаРаздела, это не отражается в Форма.БС_ТаблицаРазделов
Если меняю что-то в Форма.БС_ТаблицаРазделов через индекс ([1]) то меняется.
1С:Предприятие 8.3 (8.3.24.1586)
Приходится писать так:
Похоже, что ДанныеФормыЭлементКоллекции не связан с таблицей ДанныеФормыКоллекция? Создается его копия или как?
Форма.БС_ТаблицаРазделов - ДанныеФормыКоллекция
Перебираю ее элементы на сервере в СтрокаРаздела через Для Каждого:
СтрокаРаздела - ДанныеФормыЭлементКоллекции
Так вот, если что-то меняю в СтрокаРаздела, это не отражается в Форма.БС_ТаблицаРазделов
Если меняю что-то в Форма.БС_ТаблицаРазделов через индекс ([1]) то меняется.
1С:Предприятие 8.3 (8.3.24.1586)
Приходится писать так:
Для ИндРаздела = 1 ПО Форма.БС_ТаблицаРазделов.Количество() Цикл
СтрокаРаздела = Форма.БС_ТаблицаРазделов[ИндРаздела-1];
...
СтрокаРаздела.КоличествоЗадач = СтрокаРаздела.КоличествоЗадач + 1;
...
//Почему-то не обновляется
ЗаполнитьЗначенияСвойств(Форма.БС_ТаблицаРазделов[ИндРаздела-1],СтрокаРаздела);
КонецЦикла;
ПоказатьПохоже, что ДанныеФормыЭлементКоллекции не связан с таблицей ДанныеФормыКоллекция? Создается его копия или как?
По теме из базы знаний
- Сравнение 1С8 и Navision
- Конфигурация Flowcon: Набор инструментов для управления задачами, проектами и бизнесом в 1С
- [ПОТРАЧЕНО] Динамическая таблица формы
- Расширяемый фреймворк на 1С, или Нюансы натягивания совы на глобус
- Быстрый фронт в базе размером 8.8 терабайт – наши стандарты при разработке компонентов системы
Найденные решения
(5) Дык ясен пень! ИзменитьРеквизиты() - это практическое перестроение формы заново, инициализация всех реквизитов с присваиванием им новых внутренних идентификаторов/ссылок. Соответственно, все существующие в оперативной памяти прямые ссылки на них становятся неактуальными.
А вот обращение по индексу - это всегда новое считывание данных в новую "переменную" (область памяти). Поэтому оно работает всегда.
А вот обращение по индексу - это всегда новое считывание данных в новую "переменную" (область памяти). Поэтому оно работает всегда.
(4)
удалось воспроизвести ситуцию в отдельной обработке.
проблема проявляется только если внутри цикла добавлять новые реквизиты формы.
Тогда ссылка на строку перестает указывать каким-то образом на эту форму.
Я так понимаю, это недокументированная ошибка (фича)?
удалось воспроизвести ситуцию в отдельной обработке.
проблема проявляется только если внутри цикла добавлять новые реквизиты формы.
Тогда ссылка на строку перестает указывать каким-то образом на эту форму.
Я так понимаю, это недокументированная ошибка (фича)?
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДобавляемыеРеквизиты = Новый Массив; //Определяем массив добавляемых реквизитов
ИмяРеквизитаТаблицыРазделов = "БС_ТаблицаРазделов";
НовыйРеквизит = Новый РеквизитФормы(ИмяРеквизитаТаблицыРазделов, Новый ОписаниеТипов("ТаблицаЗначений"));
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); //Применяем реквизиты
ДобавляемыеРеквизиты = Новый Массив; //Определяем массив добавляемых реквизитов
ТипЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 0));
НовыйРеквизит = Новый РеквизитФормы("КоличествоЗадач",ТипЧисло,ИмяРеквизитаТаблицыРазделов);
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); //Применяем реквизиты
КонецПроцедуры
&НаКлиенте
Процедура Тест(Команда)
ТестНаСервере();
КонецПроцедуры
Функция ТестНаСервере()
СчитатьНаСервере(ЭтаФорма);
КонецФункции
Функция СчитатьНаСервере(Форма)
Форма.БС_ТаблицаРазделов.Очистить();
Форма.БС_ТаблицаРазделов.Добавить();
Форма.БС_ТаблицаРазделов.Добавить();
Форма.БС_ТаблицаРазделов.Добавить();
Форма.БС_ТаблицаРазделов.Добавить();
Форма.БС_ТаблицаРазделов.Добавить();
Форма.БС_ТаблицаРазделов.Добавить();
Для Каждого СтрокаРаздела ИЗ Форма.БС_ТаблицаРазделов Цикл
Для Инд = 1 по 5 Цикл
ДобавляемыеРеквизиты = Новый Массив; //Определяем массив добавляемых реквизитов
ТипЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 0));
guid = "БС_" + СтрЗаменить(Новый УникальныйИдентификатор(), "-", "");
НовыйРеквизит = Новый РеквизитФормы(guid, ТипЧисло);
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); //Применяем реквизиты
НовыйЭлемент = Форма.Элементы.Добавить(guid,Тип("ПолеФормы"));
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = guid;
Форма[guid] = guid;
СтрокаРаздела.КоличествоЗадач = СтрокаРаздела.КоличествоЗадач + 1;
КонецЦикла;
КонецЦикла;
Сообщить("СтрокаРаздела.КоличествоЗадач = " + СтрокаРаздела.КоличествоЗадач);
Сообщить("Форма.БС_ТаблицаРазделов[0].КоличествоЗадач = " + Форма.БС_ТаблицаРазделов[0].КоличествоЗадач);
КонецФункции
ПоказатьПрикрепленные файлы:
ТестДобавленнойТаблицы.epf

Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(4)
удалось воспроизвести ситуцию в отдельной обработке.
проблема проявляется только если внутри цикла добавлять новые реквизиты формы.
Тогда ссылка на строку перестает указывать каким-то образом на эту форму.
Я так понимаю, это недокументированная ошибка (фича)?
удалось воспроизвести ситуцию в отдельной обработке.
проблема проявляется только если внутри цикла добавлять новые реквизиты формы.
Тогда ссылка на строку перестает указывать каким-то образом на эту форму.
Я так понимаю, это недокументированная ошибка (фича)?
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДобавляемыеРеквизиты = Новый Массив; //Определяем массив добавляемых реквизитов
ИмяРеквизитаТаблицыРазделов = "БС_ТаблицаРазделов";
НовыйРеквизит = Новый РеквизитФормы(ИмяРеквизитаТаблицыРазделов, Новый ОписаниеТипов("ТаблицаЗначений"));
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); //Применяем реквизиты
ДобавляемыеРеквизиты = Новый Массив; //Определяем массив добавляемых реквизитов
ТипЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 0));
НовыйРеквизит = Новый РеквизитФормы("КоличествоЗадач",ТипЧисло,ИмяРеквизитаТаблицыРазделов);
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
ЭтаФорма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); //Применяем реквизиты
КонецПроцедуры
&НаКлиенте
Процедура Тест(Команда)
ТестНаСервере();
КонецПроцедуры
Функция ТестНаСервере()
СчитатьНаСервере(ЭтаФорма);
КонецФункции
Функция СчитатьНаСервере(Форма)
Форма.БС_ТаблицаРазделов.Очистить();
Форма.БС_ТаблицаРазделов.Добавить();
Форма.БС_ТаблицаРазделов.Добавить();
Форма.БС_ТаблицаРазделов.Добавить();
Форма.БС_ТаблицаРазделов.Добавить();
Форма.БС_ТаблицаРазделов.Добавить();
Форма.БС_ТаблицаРазделов.Добавить();
Для Каждого СтрокаРаздела ИЗ Форма.БС_ТаблицаРазделов Цикл
Для Инд = 1 по 5 Цикл
ДобавляемыеРеквизиты = Новый Массив; //Определяем массив добавляемых реквизитов
ТипЧисло = Новый ОписаниеТипов("Число", Новый КвалификаторыЧисла(10, 0));
guid = "БС_" + СтрЗаменить(Новый УникальныйИдентификатор(), "-", "");
НовыйРеквизит = Новый РеквизитФормы(guid, ТипЧисло);
ДобавляемыеРеквизиты.Добавить(НовыйРеквизит);
Форма.ИзменитьРеквизиты(ДобавляемыеРеквизиты); //Применяем реквизиты
НовыйЭлемент = Форма.Элементы.Добавить(guid,Тип("ПолеФормы"));
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = guid;
Форма[guid] = guid;
СтрокаРаздела.КоличествоЗадач = СтрокаРаздела.КоличествоЗадач + 1;
КонецЦикла;
КонецЦикла;
Сообщить("СтрокаРаздела.КоличествоЗадач = " + СтрокаРаздела.КоличествоЗадач);
Сообщить("Форма.БС_ТаблицаРазделов[0].КоличествоЗадач = " + Форма.БС_ТаблицаРазделов[0].КоличествоЗадач);
КонецФункции
ПоказатьПрикрепленные файлы:
ТестДобавленнойТаблицы.epf

(5) Дык ясен пень! ИзменитьРеквизиты() - это практическое перестроение формы заново, инициализация всех реквизитов с присваиванием им новых внутренних идентификаторов/ссылок. Соответственно, все существующие в оперативной памяти прямые ссылки на них становятся неактуальными.
А вот обращение по индексу - это всегда новое считывание данных в новую "переменную" (область памяти). Поэтому оно работает всегда.
А вот обращение по индексу - это всегда новое считывание данных в новую "переменную" (область памяти). Поэтому оно работает всегда.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот