Выгрузка В ТЗ з строки с разделителем. Подскажите!

  • Автор темы Elle
  • Дата начала
Статус
Закрыто для дальнейших ответов.
E

Elle

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

SeverBap

Код:
Процедура ЗаполнитьАналоги()
Сп=СоздатьОбъект("СписокЗначений"); 
СпСЗ=СоздатьОбъект("Справочник.СЗ"); 
СпСЗ.ИспользоватьВладельца(ТекущийЭлемент());
СпСЗ.ВыбратьЭлементы();
Пока СпСЗ.ПолучитьЭлемент() = 1 Цикл
Если СпСЗ.ПометкаУдаления()=1 Тогда
Продолжить;
КонецЕсли;
Сп.ИзСтрокиСРазделителями(СпСЗ.КодТМЦ);
СпТМЦ=СоздатьОбъект("Справочник.ТМЦ");
Для а=1 по Сп.РазмерСписка() Цикл
КодТМЦ=СокрЛП(Сп.ПолучитьЗначение(а));
Если СпТМЦ.НайтиПоКоду("КодТМЦ")=1 Тогда
ТабЗнач.НоваяСтрока();
ТабЗнач.Аналог=СпТМЦ.ТекущийЭлемент();
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры

Процедура ДобавитьАналог()
кол=""; 
Если ВвестиЗначение(кол,"Выбирите","Справочник.ТМЦ")=1 Тогда 
ТабЗнач.НоваяСтрока();
ТабЗнач.Аналог=кол; 
Наименование=ЗначениеВСтроку(ТабЗнач.Аналог); 
КонецЕсли;
КонецПроцедуры
Нужны уточнения: Где именно расположена процедура заполнитьАналоги()? и ДобавитьАналог()?
Если допустим в владельце то для чего тебе токая борода??? - То тебе надо было на форму владельца расположить списокзначений (список аналогов - или проще говоря список элементов подчиненного справочника) который заполняется элементарно....
есть еще конечно альтернативный вариант (у меня есть подозрение что так оно и есть) то что у тебя список аналогов может быть не привязан к подчинному справочнику тоесть у тебя в подчиненном справочнике хранится один элемент всегда и у него есть один реквизит с типом строка в которой хранится список всех тмц добавленных из контекста работы со списоком значений и строки! И на самой форме имеются только три кнопки и список значений (или таблица значений) с скрытым реквизитом КодТМЦ!
Тогда уместны твои процедуры с моей корректировкой!
 
E

Elle

есть еще конечно альтернативный вариант (у меня есть подозрение что так оно и есть) то что у тебя список аналогов может быть не привязан к подчинному справочнику тоесть у тебя в подчиненном справочнике хранится один элемент всегда и у него есть один реквизит с типом строка в которой хранится список всех тмц добавленных из контекста работы со списоком значений и строки! И на самой форме имеются только три кнопки и список значений (или таблица значений) с скрытым реквизитом КодТМЦ!
Тогда уместны твои процедуры с моей корректировкой!
Да ето точно так и есть. Щас буду пробовать. Спасибо.
 
S

SeverBap

Код:
Процедура ЗаполнитьАналоги()
Сп=СоздатьОбъект("СписокЗначений"); 
СпСЗ=СоздатьОбъект("Справочник.СЗ"); 
СпСЗ.ИспользоватьВладельца(ТекущийЭлемент());
СпСЗ.ВыбратьЭлементы();
Пока СпСЗ.ПолучитьЭлемент() = 1 Цикл
Если СпСЗ.ПометкаУдаления()=1 Тогда
Продолжить;
КонецЕсли;
Сп.ИзСтрокиСРазделителями(СпСЗ.КодТМЦ);
СпТМЦ=СоздатьОбъект("Справочник.ТМЦ");
Для а=1 по Сп.РазмерСписка() Цикл
КодТМЦ=СокрЛП(Сп.ПолучитьЗначение(а));
Если СпТМЦ.НайтиПоКоду(КодТМЦ)=1 Тогда
ТабЗнач.НоваяСтрока();
ТабЗнач.Аналог=СпТМЦ.ТекущийЭлемент();
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры

Процедура ДобавитьАналог()
кол=""; 
Если ВвестиЗначение(кол,"Выбирите","Справочник.ТМЦ")=1 Тогда 
ТабЗнач.НоваяСтрока();
ТабЗнач.Аналог=кол; 
КонецЕсли;
КонецПроцедуры
исправил ошибки - как говорится поспешность нужна только при ловли ... с тебя плюсик! :welcome:
 
P

puh14

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

КонецЦикла;
 
E

Elle

Работает, вот только как организовать загрузку с ТЗ добавленых елементов в подчиненный справочник в строку через разделитель?
 
S

SeverBap

Скорее всего надо накалякать что-то в этой манере:
Код:
ВременныйСписок=Создатьобъект("СписокЗначений");
ТабЗнач.ВыбратьСтроку();
Пока ТабЗнач.ПолучитьСтроку()=1 Цикл
ВременныйСписок.ДобавитьЗначение(ТабЗнач.Аналог.Код);
КонецЦикла;	
КодТМЦ=СокрЛП(ВременныйСписок.ВСтрокуСРазделителями());
Нужно это чудо добавить при записи и при это надо проверить одинаковые эти строки (старая и новая) или нет!
 
S

SeverBap

вообщем все я тут для тебя написал!
 
E

Elle

Вот только недобавляет значения ТЗ в подчиненный справочник.
 
S

SeverBap

Ну естественно не добавит, это нигде у нас не было написано. Для того что бы записать результаты необходимо написать или в процедуре при записи или в процедуре приЗакрытии кусочек который тебе я выложил.
тебе необходимо сделать в вот так:
Код:
	Если (ТабЗнач.КоличествоСтрок()>0) И (Выбран()=1) Тогда
СправочникАналогов=СоздатьОбъект("Справочник.СЗ");
ВременныйСписок=Создатьобъект("СписокЗначений");
ТабЗнач.ВыбратьСтроку();
Пока ТабЗнач.ПолучитьСтроку()=1 Цикл
ВременныйСписок.ДобавитьЗначение(ТабЗнач.Аналог.Код);
КонецЦикла;	
КодТМЦ=СокрЛП(ВременныйСписок.ВСтрокуСРазделителями());
СправочникАналогов.ИспользоватьВладельца(ТекущийЭлемент());
Если СправочникАналогов.ВыбратьЭлементы()=1 Тогда
Пока СправочникАналогов.ПолучитьЭлемент() = 1 Цикл
Если СправочникАналогов.ПометкаУдаления()=1 Тогда
Продолжить;
Иначе
Если СокрЛП(СправочникАналогов.КодТМЦ)<>КодТМЦ Тогда
СправочникАналогов.КодТМЦ=КодТМЦ;
СправочникАналогов.Записать();
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Иначе
СправочникАналогов.Новый();
СправочникАналогов.Владелец=ТекущийЭлемент();
СправочникАналогов.КодТМЦ=КодТМЦ;
СправочникАналогов.Записать();
КонецЕсли;
КонецЕсли;
Можешь ее поместить куда тебе надо! (процедуру при закрытии ) :welcome:
 
E

Elle

Итак не отображается в ТЗ при открытии формы элементы(есть введенные в подчиненном справочнике). Если в подчиненном справочнике нет реквизита владельца, то он не создается автоматически при записи.

Добавлено:
И на самой форме имеются только три кнопки и список значений (или таблица значений) с скрытым реквизитом КодТМЦ!
А на форме должен быть скрытый реквизит КодТМЦ (не достаточно справочник подчиненным сделать)? :newconfus:
 
S

SeverBap

;) Может я туплю (что я не врубаюсь):
Ты в товарах добавил дополнительную закладку (допустим) Аналоги - на этой закладке расположил таблицу значений с аналогами. Аналоги берутся у тебя из подчиненного справочника товаров СЗ, который содержит только один элемент справочника. У этого элемента имеется реквизит строкового типа (неограниченной длинны) который хранит список кодов товаров (аналогов).

Для того что бы он автоматически отображал (получал данные из строки) необходимо при открытии дописать типа:
Код:
ТабЗнач.УдалитьСтроки();
ЗаполнитьАналоги();
или сделать это ввиде функции и повестить на форму:
Код:
Функция ОбновитьСписокАналогов()
ТабЗнач.УдалитьСтроки();
ЗаполнитьАналоги();
КонецФункции
....

У меня есть вопрос: Если допустим справочник "СЗ" у тебя самописный и у него имеется только один реквизит КодТМЦ, а почему нельзя сделать только один рекивит с типом "Товар" (еще надо в нем установить галочку отбор по реквизиты, сортировка) и при добавление нового аналога делать простое добавление элемента подчиненного справочника?? При этом решаются все проблемы и твои процедуры будут такие:

Код:
Процедура ЗаполнитьАналоги()
СписокАналогов=СоздатьОбъект("Справочник.СЗ"); 
СписокАналогов.ИспользоватьВладельца(ТекущийЭлемент());
СписокАналогов.ВыбратьЭлементы();
Пока СписокАналогов.ПолучитьЭлемент() = 1 Цикл
Если СписокАналогов.ПометкаУдаления()=1 Тогда
Продолжить;
КонецЕсли;
ТабЗнач.НоваяСтрока();
ТабЗнач.Аналог=СписокАналогов.ТекущийЭлемент();
КонецЦикла;
КонецПроцедуры
Часть кода в процедуре ПриЗакрытии():
Код:
	Если (ТабЗнач.КоличествоСтрок()>0) И (Выбран()=1) Тогда
СправочникАналогов=СоздатьОбъект("Справочник.СЗ");
ТабЗнач.ВыбратьСтроку();
Пока ТабЗнач.ПолучитьСтроку()=1 Цикл
Если СправочникАналогов.НайтиПоРеквизиту("Товар",ТабЗнач.Аналог,1)=0 Тогда
СправочникАналогов.Новый();
СправочникАналогов.Владелец=ТекущийЭлемент();
СправочникАналогов.Товар=ТабЗнач.Аналог;
СправочникАналогов.Записать();
КонецЕсли;	
КонецЦикла;	
КонецЕсли;
В добавление можно добавить проверку на наличее такого у нас в таблице:
Код:
Процедура ДобавитьАналог()
кол=""; 
Если ВвестиЗначение(кол,"Выбирите","Справочник.ТМЦ")=1 Тогда
Если ТабЗнач.НайтиЗначение(кол,,"Аналог")=0 Тогда
ТабЗнач.НоваяСтрока();
ТабЗнач.Аналог=кол;
Иначе
Сообщить("Такой аналог уже имеется!!!","!!!");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
и соответсвенно в приОткрытии добавить несколько строк:
Код:
Если Выбра()=1 Тогда
ТабЗнач.УдалитьСтроки();
ЗаполнитьАналоги();
КонецЕсли;
Ну как ты поступишь? :ya_za:
 
V

vitfil

Вопрос к автору: как собираетесь отслеживать целостность БД, если будет удален один из элементов, ссылки на который есть в вашей длинной строке?
 
E

Elle

Вопрос к автору: как собираетесь отслеживать целостность БД, если будет удален один из элементов, ссылки на который есть в вашей длинной строке?
:) очень интересний вопрос. Об етом я еще не думала)
 
S

SeverBap

Так что надо делать так я описал выше!
 
S

SeverBap

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!