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

Тема в разделе "1C и всё что с ней связано", создана пользователем Elle, 15 мар 2010.

Статус темы:
Закрыта.
  1. Elle

    Elle Гость

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

    SeverBap Well-Known Member

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

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

    Elle Гость

    Да ето точно так и есть. Щас буду пробовать. Спасибо.
     
  4. SeverBap

    SeverBap Well-Known Member

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

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

    puh14 Well-Known Member
    1C Team

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

    КонецЦикла;
     
  6. Elle

    Elle Гость

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

    SeverBap Well-Known Member

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

    Elle Гость

    Я начинающий программист, потому может расшифруете
    почему запрет и что сделать?
     
  9. SeverBap

    SeverBap Well-Known Member

    Регистрация:
    18 сен 2007
    Сообщения:
    440
    Симпатии:
    0
    вообщем все я тут для тебя написал!
     
  10. Elle

    Elle Гость

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

    SeverBap Well-Known Member

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

    Elle Гость

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

    Добавлено:
    А на форме должен быть скрытый реквизит КодТМЦ (не достаточно справочник подчиненным сделать)? :newconfus:
     
  13. SeverBap

    SeverBap Well-Known Member

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

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

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

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

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Вопрос к автору: как собираетесь отслеживать целостность БД, если будет удален один из элементов, ссылки на который есть в вашей длинной строке?
     
  15. Elle

    Elle Гость

    :) очень интересний вопрос. Об етом я еще не думала)
     
  16. SeverBap

    SeverBap Well-Known Member

    Регистрация:
    18 сен 2007
    Сообщения:
    440
    Симпатии:
    0
    Так что надо делать так я описал выше!
     
  17. vitfil

    vitfil IT-интегратор

    Регистрация:
    2 апр 2004
    Сообщения:
    2.070
    Симпатии:
    0
    Вот так и погибли леса Амазонки...
     
  18. SeverBap

    SeverBap Well-Known Member

    Регистрация:
    18 сен 2007
    Сообщения:
    440
    Симпатии:
    0
    Леса - лесами, 1С - http://codeby.net/
     
  19. Elle

    Elle Гость

    Вар я не ищу легких путей :) потому изначально выбрана первая часть твоего предложения.
    Ну не надо сразу бросать камни в мой огород, ой прог.код ;)
     
  20. SeverBap

    SeverBap Well-Known Member

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

Поделиться этой страницей