Форум программистов, компьютерный форум, киберфорум
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/172: Рейтинг темы: голосов - 172, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 09.08.2008
Сообщений: 42

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

14.03.2010, 11:58. Показов 34656. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
1C 7.7. В справочнике надо хранить информацию в виде ТЗ(из подчиненного справочника). В подчиненном справочнике делаю реквизит,тип-строка неогр.длины.На форму вешаю ТЗ. При открытии если ТЗ пустая,то определяю структуру,и потом ввожу информацию,при добавлении выгружаю ТЗ в переменную список значений,а из списка-ВСтрокуСРазделителями() в мой реквизит справочника(который строка). В реквизите (строка) хранится инфо в виде кодов через разделитель, а в ТЗ должно отображатся вместо кодов наименование с справочника ТМЦ В ТЗ не добавляются елементы. Мож кто делал что-то подобное? Подскажите.
Процедура ЗаполнитьАналоги добавлена в проц ПриОткрытии

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Процедура ЗаполнитьАналоги()
Сп=СоздатьОбъект("СписокЗначений");
СпСЗ=СоздатьОбъект("Справочник.СЗ");
СпСЗ.ИспользоватьВладельца(ТекущийЭлемент());
СпСЗ.ВыбратьЭлементы();
Пока СпСЗ.ПолучитьЭлемент() = 1 Цикл
Если СпСЗ.ПометкаУдаления()=1 Тогда
Продолжить;
КонецЕсли;
Сп.ДобавитьЗначение(СпСЗ.КодТМЦ,"КодТМЦ");
Сп.ИзСтрокиСРазделителями(СпСЗ.КодТМЦ);
СпТМЦ=СоздатьОбъект("Справочник.ТМЦ");
Для а=1 по Сп.РазмерСписка() Цикл
Если СпТМЦ.НайтиПоКоду("КодТМЦ")=1 Тогда
Назв_ТМЦ=СпТМЦ.Наименование;
Сп.ДобавитьЗначение("Назв_ТМЦ");
ТабЗнач.НоваяСтрока();
ТабЗнач.Заполнить(Сп)
КонецЕсли;
КонецЦикла;
КонецЦикла;
Процедура ДобавитьАналог - при нажатии кнопки Добавить

Code
1
2
3
4
5
6
7
Процедура ДобавитьАналог()
кол="";
Если ВвестиЗначение(кол,"Выбирите","Справочник.ТМЦ")=1 Тогда
ТабЗнач.Аналог=кол;
Наименование=ЗначениеВСтроку(ТабЗнач.Аналог);
КонецЕсли;
КонецПроцедуры
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.03.2010, 11:58
Ответы с готовыми решениями:

Подскажите пожалуйста(выгрузка в excel)
Помогите пожалуйста. Выгружаю из 1С оборотно-сальдовую ведомость в шаблонный файл excel, т.е. необходимо руками указывать ячейки куда...

Подскажите как разбить строку на массив слов разделителем
нужно разбить строку на массив строк для дальнейшей обработки, подскажите пожалуйста кто знает, как это сделать?

Выборка данных из строки с разделителем
Всем привет. Есть таблица, в одной из ячеек которой находится строка-список, данные в строке разделены запятой. Н-р:...

21
0 / 0 / 0
Регистрация: 14.09.2007
Сообщений: 428
14.03.2010, 12:41
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Процедура ЗаполнитьАналоги()
Сп=СоздатьОбъект("СписокЗначений");
СпСЗ=СоздатьОбъект("Справочник.СЗ");
СпСЗ.ИспользоватьВладельца(ТекущийЭлемент());
СпСЗ.ВыбратьЭлементы();
Пока СпСЗ.ПолучитьЭлемент() = 1 Цикл
Если СпСЗ.ПометкаУдаления()=1 Тогда
Продолжить;
КонецЕсли;
Сп.ИзСтрокиСРазделителями(СпСЗ.КодТМЦ);
СпТМЦ=СоздатьОбъект("Справочник.ТМЦ");
Для а=1 по Сп.РазмерСписка() Цикл
КодТМЦ=СокрЛП(Сп.ПолучитьЗначение(а));
Если СпТМЦ.НайтиПоКоду("КодТМЦ")=1 Тогда
ТабЗнач.НоваяСтрока();
ТабЗнач.Аналог=СпТМЦ.ТекущийЭлемент();
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
 
Процедура ДобавитьАналог()
кол="";
Если ВвестиЗначение(кол,"Выбирите","Справочник.ТМЦ")=1 Тогда
ТабЗнач.НоваяСтрока();
ТабЗнач.Аналог=кол;
Наименование=ЗначениеВСтроку(ТабЗнач.Аналог);
КонецЕсли;
КонецПроцедуры
Нужны уточнения: Где именно расположена процедура заполнитьАналоги()? и ДобавитьАналог()?
Если допустим в владельце то для чего тебе токая борода??? - То тебе надо было на форму владельца расположить списокзначений (список аналогов - или проще говоря список элементов подчиненного справочника) который заполняется элементарно....
есть еще конечно альтернативный вариант (у меня есть подозрение что так оно и есть) то что у тебя список аналогов может быть не привязан к подчинному справочнику тоесть у тебя в подчиненном справочнике хранится один элемент всегда и у него есть один реквизит с типом строка в которой хранится список всех тмц добавленных из контекста работы со списоком значений и строки! И на самой форме имеются только три кнопки и список значений (или таблица значений) с скрытым реквизитом КодТМЦ!
Тогда уместны твои процедуры с моей корректировкой!
0
0 / 0 / 0
Регистрация: 09.08.2008
Сообщений: 42
14.03.2010, 12:49
Цитата Сообщение от Bap
есть еще конечно альтернативный вариант (у меня есть подозрение что так оно и есть) то что у тебя список аналогов может быть не привязан к подчинному справочнику тоесть у тебя в подчиненном справочнике хранится один элемент всегда и у него есть один реквизит с типом строка в которой хранится список всех тмц добавленных из контекста работы со списоком значений и строки! И на самой форме имеются только три кнопки и список значений (или таблица значений) с скрытым реквизитом КодТМЦ!
Тогда уместны твои процедуры с моей корректировкой!
Да ето точно так и есть. Щас буду пробовать. Спасибо.
0
0 / 0 / 0
Регистрация: 14.09.2007
Сообщений: 428
14.03.2010, 12:57
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Процедура ЗаполнитьАналоги()
Сп=СоздатьОбъект("СписокЗначений");
СпСЗ=СоздатьОбъект("Справочник.СЗ");
СпСЗ.ИспользоватьВладельца(ТекущийЭлемент());
СпСЗ.ВыбратьЭлементы();
Пока СпСЗ.ПолучитьЭлемент() = 1 Цикл
Если СпСЗ.ПометкаУдаления()=1 Тогда
Продолжить;
КонецЕсли;
Сп.ИзСтрокиСРазделителями(СпСЗ.КодТМЦ);
СпТМЦ=СоздатьОбъект("Справочник.ТМЦ");
Для а=1 по Сп.РазмерСписка() Цикл
КодТМЦ=СокрЛП(Сп.ПолучитьЗначение(а));
Если СпТМЦ.НайтиПоКоду(КодТМЦ)=1 Тогда
ТабЗнач.НоваяСтрока();
ТабЗнач.Аналог=СпТМЦ.ТекущийЭлемент();
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
 
Процедура ДобавитьАналог()
кол="";
Если ВвестиЗначение(кол,"Выбирите","Справочник.ТМЦ")=1 Тогда
ТабЗнач.НоваяСтрока();
ТабЗнач.Аналог=кол;
КонецЕсли;
КонецПроцедуры
исправил ошибки - как говорится поспешность нужна только при ловли ... с тебя плюсик! :welcome:
0
0 / 0 / 0
Регистрация: 07.07.2008
Сообщений: 1,401
14.03.2010, 12:58
Процедура ЗаполнитьАналоги()
Сп=СоздатьОбъект("СписокЗначений");
СпСЗ=СоздатьОбъект("Справочник.СЗ");
СпСЗ.ИспользоватьВладельца(ТекущийЭлемен т());
СпСЗ.ВыбратьЭлементы();
Пока СпСЗ.ПолучитьЭлемент() = 1 Цикл
Если СпСЗ.ПометкаУдаления()=1 Тогда
Продолжить;
КонецЕсли;
Сп.ДобавитьЗначение(СпСЗ.КодТМЦ,"КодТМЦ" );
Сп.ИзСтрокиСРазделителями(СпСЗ.КодТМЦ);///Вот честно - нафига? Если не ошибаюсь это затрет все заполеное ранее
СпТМЦ=СоздатьОбъект("Справочник.ТМЦ");
КонецЦикла;// а то непонятно - зачем каждый раз перебегать по поиску?
Для а=1 по Сп.РазмерСписка() Цикл
КодТМЦ = Сп.ПолучитьЗначение(а);// а то искать будет на деревне у дедушки
Если СпТМЦ.НайтиПоКоду(КодТМЦ)=1 Тогда//когда КодТМЦ в кавычках - то это строка, то бишь ищет тмц у которого код называется строкой //"КодТМЦ"
Назв_ТМЦ=СпТМЦ.Наименование;
Сп.ДобавитьЗначение("Назв_ТМЦ");//нафига и код и название в один список??
ТабЗнач.НоваяСтрока();
ТабЗнач.Заполнить(Сп);//а эта штука все найденые ранее значения тупо затрет.
КонецЕсли;

КонецЦикла;
0
0 / 0 / 0
Регистрация: 09.08.2008
Сообщений: 42
14.03.2010, 13:00
Работает, вот только как организовать загрузку с ТЗ добавленых елементов в подчиненный справочник в строку через разделитель?
0
0 / 0 / 0
Регистрация: 14.09.2007
Сообщений: 428
14.03.2010, 13:08
Скорее всего надо накалякать что-то в этой манере:

Code
1
2
3
4
5
6
ВременныйСписок=Создатьобъект("СписокЗначений");
ТабЗнач.ВыбратьСтроку();
Пока ТабЗнач.ПолучитьСтроку()=1 Цикл
ВременныйСписок.ДобавитьЗначение(ТабЗнач.Аналог.Код);
КонецЦикла;
КодТМЦ=СокрЛП(ВременныйСписок.ВСтрокуСРазделителями());
Нужно это чудо добавить при записи и при это надо проверить одинаковые эти строки (старая и новая) или нет!
0
0 / 0 / 0
Регистрация: 09.08.2008
Сообщений: 42
14.03.2010, 13:10
Я начинающий программист, потому может расшифруете


Цитата Сообщение от puh14
ТабЗнач.Заполнить(Сп);//а эта штука все найденые ранее значения тупо затрет.
почему запрет и что сделать?
0
0 / 0 / 0
Регистрация: 14.09.2007
Сообщений: 428
14.03.2010, 13:15
вообщем все я тут для тебя написал!
0
0 / 0 / 0
Регистрация: 09.08.2008
Сообщений: 42
14.03.2010, 14:41
Вот только недобавляет значения ТЗ в подчиненный справочник.
0
0 / 0 / 0
Регистрация: 14.09.2007
Сообщений: 428
14.03.2010, 15:08
Ну естественно не добавит, это нигде у нас не было написано. Для того что бы записать результаты необходимо написать или в процедуре при записи или в процедуре приЗакрытии кусочек который тебе я выложил.
тебе необходимо сделать в вот так:

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    Если (ТабЗнач.КоличествоСтрок()>0) И (Выбран()=1) Тогда
СправочникАналогов=СоздатьОбъект("Справочник.СЗ");
ВременныйСписок=Создатьобъект("СписокЗначений");
ТабЗнач.ВыбратьСтроку();
Пока ТабЗнач.ПолучитьСтроку()=1 Цикл
ВременныйСписок.ДобавитьЗначение(ТабЗнач.Аналог.Код);
КонецЦикла;
КодТМЦ=СокрЛП(ВременныйСписок.ВСтрокуСРазделителями());
СправочникАналогов.ИспользоватьВладельца(ТекущийЭлемент());
Если СправочникАналогов.ВыбратьЭлементы()=1 Тогда
Пока СправочникАналогов.ПолучитьЭлемент() = 1 Цикл
Если СправочникАналогов.ПометкаУдаления()=1 Тогда
Продолжить;
Иначе
Если СокрЛП(СправочникАналогов.КодТМЦ)<>КодТМЦ Тогда
СправочникАналогов.КодТМЦ=КодТМЦ;
СправочникАналогов.Записать();
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Иначе
СправочникАналогов.Новый();
СправочникАналогов.Владелец=ТекущийЭлемент();
СправочникАналогов.КодТМЦ=КодТМЦ;
СправочникАналогов.Записать();
КонецЕсли;
КонецЕсли;
Можешь ее поместить куда тебе надо! (процедуру при закрытии ) :welcome:
0
0 / 0 / 0
Регистрация: 09.08.2008
Сообщений: 42
14.03.2010, 17:51
Итак не отображается в ТЗ при открытии формы элементы(есть введенные в подчиненном справочнике). Если в подчиненном справочнике нет реквизита владельца, то он не создается автоматически при записи.

Добавлено:


Цитата Сообщение от Bap
И на самой форме имеются только три кнопки и список значений (или таблица значений) с скрытым реквизитом КодТМЦ!
А на форме должен быть скрытый реквизит КодТМЦ (не достаточно справочник подчиненным сделать)? :newconfus:
0
0 / 0 / 0
Регистрация: 14.09.2007
Сообщений: 428
15.03.2010, 16:50
;) Может я туплю (что я не врубаюсь):
Ты в товарах добавил дополнительную закладку (допустим) Аналоги - на этой закладке расположил таблицу значений с аналогами. Аналоги берутся у тебя из подчиненного справочника товаров СЗ, который содержит только один элемент справочника. У этого элемента имеется реквизит строкового типа (неограниченной длинны) который хранит список кодов товаров (аналогов).

Для того что бы он автоматически отображал (получал данные из строки) необходимо при открытии дописать типа:

Code
1
2
ТабЗнач.УдалитьСтроки();
ЗаполнитьАналоги();
или сделать это ввиде функции и повестить на форму:

Code
1
2
3
4
Функция ОбновитьСписокАналогов()
ТабЗнач.УдалитьСтроки();
ЗаполнитьАналоги();
КонецФункции
....

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


Code
1
2
3
4
5
6
7
8
9
10
11
12
Процедура ЗаполнитьАналоги()
СписокАналогов=СоздатьОбъект("Справочник.СЗ");
СписокАналогов.ИспользоватьВладельца(ТекущийЭлемент());
СписокАналогов.ВыбратьЭлементы();
Пока СписокАналогов.ПолучитьЭлемент() = 1 Цикл
Если СписокАналогов.ПометкаУдаления()=1 Тогда
Продолжить;
КонецЕсли;
ТабЗнач.НоваяСтрока();
ТабЗнач.Аналог=СписокАналогов.ТекущийЭлемент();
КонецЦикла;
КонецПроцедуры
Часть кода в процедуре ПриЗакрытии():

Code
1
2
3
4
5
6
7
8
9
10
11
12
    Если (ТабЗнач.КоличествоСтрок()>0) И (Выбран()=1) Тогда
СправочникАналогов=СоздатьОбъект("Справочник.СЗ");
ТабЗнач.ВыбратьСтроку();
Пока ТабЗнач.ПолучитьСтроку()=1 Цикл
Если СправочникАналогов.НайтиПоРеквизиту("Товар",ТабЗнач.Аналог,1)=0 Тогда
СправочникАналогов.Новый();
СправочникАналогов.Владелец=ТекущийЭлемент();
СправочникАналогов.Товар=ТабЗнач.Аналог;
СправочникАналогов.Записать();
КонецЕсли;
КонецЦикла;
КонецЕсли;
В добавление можно добавить проверку на наличее такого у нас в таблице:

Code
1
2
3
4
5
6
7
8
9
10
11
Процедура ДобавитьАналог()
кол="";
Если ВвестиЗначение(кол,"Выбирите","Справочник.ТМЦ")=1 Тогда
Если ТабЗнач.НайтиЗначение(кол,,"Аналог")=0 Тогда
ТабЗнач.НоваяСтрока();
ТабЗнач.Аналог=кол;
Иначе
Сообщить("Такой аналог уже имеется!!!","!!!");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
и соответсвенно в приОткрытии добавить несколько строк:

Код (Text):
Если Выбра()=1 Тогда
ТабЗнач.УдалитьСтроки();
ЗаполнитьАналоги();
КонецЕсли;
Ну как ты поступишь? :ya_za:
0
0 / 0 / 0
Регистрация: 28.03.2004
Сообщений: 1,913
16.03.2010, 13:34
Вопрос к автору: как собираетесь отслеживать целостность БД, если будет удален один из элементов, ссылки на который есть в вашей длинной строке?
0
0 / 0 / 0
Регистрация: 09.08.2008
Сообщений: 42
16.03.2010, 14:56
Цитата Сообщение от vitfil
Вопрос к автору: как собираетесь отслеживать целостность БД, если будет удален один из элементов, ссылки на который есть в вашей длинной строке?
очень интересний вопрос. Об етом я еще не думала)
0
0 / 0 / 0
Регистрация: 14.09.2007
Сообщений: 428
16.03.2010, 16:21
Так что надо делать так я описал выше!
0
0 / 0 / 0
Регистрация: 28.03.2004
Сообщений: 1,913
16.03.2010, 16:24
Цитата Сообщение от Elle
очень интересний вопрос. Об етом я еще не думала
Вот так и погибли леса Амазонки...
0
0 / 0 / 0
Регистрация: 14.09.2007
Сообщений: 428
16.03.2010, 16:27
Цитата Сообщение от vitfil
Вот так и погибли леса Амазонки...
Леса - лесами, 1С - http:///
0
0 / 0 / 0
Регистрация: 09.08.2008
Сообщений: 42
16.03.2010, 16:38
Вар я не ищу легких путей потому изначально выбрана первая часть твоего предложения.


Цитата Сообщение от vitfil
Вот так и погибли леса Амазонки...
Ну не надо сразу бросать камни в мой огород, ой прог.код ;)
0
0 / 0 / 0
Регистрация: 14.09.2007
Сообщений: 428
16.03.2010, 16:46
как решили так и реализовали!


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

Code
1
2
3
4
5
6
7
        Для а=1 по Сп.РазмерСписка() Цикл
КодТМЦ=СокрЛП(Сп.ПолучитьЗначение(а));
Если СпТМЦ.НайтиПоКоду(КодТМЦ)=1 Тогда
ТабЗнач.НоваяСтрока();
ТабЗнач.Аналог=СпТМЦ.ТекущийЭлемент();
КонецЕсли;
КонецЦикла;
соответсвенно при закрытии перезапишим новый правильный!
Так что целостность все нормально!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.03.2010, 16:46
Помогаю со студенческими работами здесь

Извлечение данных из строки с разделителем
Есть строка с разделителями: 'запись1;запись2;запись1;запись3;' и т.д. как проще всего извлечь записи?

Как убрать элемент из строки с разделителем?
Привет! Есть строка с разделителем, которая может выглядеть так: 1,2,3 Нужно из этой строки вырезать какой-то элемент, т.е. 1, 2 или...

Выделить из строки подстроку, следующую за последним разделителем
Доброго времени суток. Задача по ходу несложная. И на другом языке пр я бы её уже давно решил. Но мне необходимо именно в cmd в котором...

Что будет разделителем для строки cin>>?
Что будет разделителем для строки cin&gt;&gt;? (Напр. для «Один два»).

Выгрузка строки из таблицы без перезагрузки страницы
Здраствуйте! Можно ли как-то при наведении на объект выгружать с таблицы БД поле по определенному id и отображать его? попробовал вот...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 01.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 31.01.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru