Загрузка данных из DBF файла в 1С БП 3.0

1. user1C99 18.09.23 14:12 Сейчас в теме
Здравствуйте.
Есть DBF файл с колонками "Номер документа", "Дата документа", "ИНН Контрагента", "Номенклатура", "Цена", "Количество", "Ставка НДС" и "Сумма".
Ситуация следующая, в файле может быть несколько строк с одним и тем же номером документа и датой, но разной номенклатурой, т.к. документ поступления один. Подскажите, пожалуйста, каким образом можно создать документы поступления в 1С БП, что бы не на каждую строчку dbf файла создавался документ, а с учетом группировки по номеру документа и дате с заполненной информацией по номенклатуре?
По теме из базы знаний
Найденные решения
47. Torin57 7 20.09.23 21:04 Сейчас в теме
Есть еще такой вариант.

	
ТипСтрока50 = Новый ОписаниеТипов("Строка", ,
	 Новый КвалификаторыСтроки(50, ДопустимаяДлина.Переменная));
	 
	 ТипЧисло10_2 =Новый ОписаниеТипов("Число",
				 Новый КвалификаторыЧисла(10, 2, ДопустимыйЗнак.Любой));	 
				 
	ТаблицаЗначений = Новый ТаблицаЗначений;
	ТаблицаЗначений.Колонки.Добавить("НомерДокумента", ТипСтрока50);
	ТаблицаЗначений.Колонки.Добавить("ДатаДокумента", ТипСтрока50);
	ТаблицаЗначений.Колонки.Добавить("ИННКонтрагента", ТипСтрока50);
	ТаблицаЗначений.Колонки.Добавить("Номенклатура", ТипСтрока50);
	ТаблицаЗначений.Колонки.Добавить("Цена", ТипЧисло10_2);
	ТаблицаЗначений.Колонки.Добавить("Количество", ТипЧисло10_2);
	ТаблицаЗначений.Колонки.Добавить("СтавкаНДС", ТипЧисло10_2);
	ТаблицаЗначений.Колонки.Добавить("Сумма", ТипЧисло10_2);
	
	ТаблицаЗначений.Добавить();
	ТаблицаЗначений[0].НомерДокумента = "Документ1";
	ТаблицаЗначений[0].ДатаДокумента = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
	ТаблицаЗначений[0].ИННКонтрагента = "1234567890";
	ТаблицаЗначений[0].Номенклатура = "Товар1";
	ТаблицаЗначений[0].Цена = 1000;
	ТаблицаЗначений[0].Количество = 5;
	ТаблицаЗначений[0].СтавкаНДС = 20;
	ТаблицаЗначений[0].Сумма = ТаблицаЗначений[0].Цена * ТаблицаЗначений[0].Количество;
	
	ТаблицаЗначений.Добавить();
	ТаблицаЗначений[1].НомерДокумента = "Документ1";
	ТаблицаЗначений[1].ДатаДокумента = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
	ТаблицаЗначений[1].ИННКонтрагента = "1234567890";
	ТаблицаЗначений[1].Номенклатура = "Товар2";
	ТаблицаЗначений[1].Цена = 1500;
	ТаблицаЗначений[1].Количество = 3;
	ТаблицаЗначений[1].СтавкаНДС = 10;
	ТаблицаЗначений[1].Сумма = ТаблицаЗначений[1].Цена * ТаблицаЗначений[1].Количество;
	
	ТаблицаЗначений.Добавить();
	ТаблицаЗначений[2].НомерДокумента = "Документ3";
	ТаблицаЗначений[2].ДатаДокумента = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
	ТаблицаЗначений[2].ИННКонтрагента = "5432167890";
	ТаблицаЗначений[2].Номенклатура = "Товар3";
	ТаблицаЗначений[2].Цена = 2000;
	ТаблицаЗначений[2].Количество = 2;
	ТаблицаЗначений[2].СтавкаНДС = 20;
	ТаблицаЗначений[2].Сумма = ТаблицаЗначений[2].Цена * ТаблицаЗначений[2].Количество;
	
	ТаблицаЗначений.Добавить();
	ТаблицаЗначений[3].НомерДокумента = "Документ4";
	ТаблицаЗначений[3].ДатаДокумента = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
	ТаблицаЗначений[3].ИННКонтрагента = "0987654321";
	ТаблицаЗначений[3].Номенклатура = "Товар4";
	ТаблицаЗначений[3].Цена = 3000;
	ТаблицаЗначений[3].Количество = 1;
	ТаблицаЗначений[3].СтавкаНДС = 10;
	ТаблицаЗначений[3].Сумма = ТаблицаЗначений[3].Цена * ТаблицаЗначений[3].Количество;
	
	ТабДокументы = ТаблицаЗначений.Скопировать();
	ТабДокументы.Свернуть("НомерДокумента, ДатаДокумента, ИННКонтрагента", "Сумма");
	
	Для каждого ТекДокумент Из ТабДокументы Цикл
		
		// Здесь создаем документ
		НомерДок			= ТекДокумент.НомерДокумента;
		ДатаДок			= ТекДокумент.ДатаДокумента;
		ИННКонтрагента	= ТекДокумент.ИННКонтрагента;
		ОбщаяСумма		= ТекДокумент.Сумма;
		
		Сообщить("НомерДок "+НомерДок);
		Сообщить("ДатаДок "+ДатаДок);
		Сообщить("ИННКонтрагента "+ИННКонтрагента);
		Сообщить("ОбщаяСумма "+ОбщаяСумма);

		ОтборСтрокТекущегоДокумента = Новый Структура;
		ОтборСтрокТекущегоДокумента.Вставить("НомерДокумента",	  НомерДок);
		ОтборСтрокТекущегоДокумента.Вставить("ДатаДокумента",	  ДатаДок);
		
		СтрокиДокумента = ТаблицаЗначений.НайтиСтроки(ОтборСтрокТекущегоДокумента);
		
		Для каждого СтрокаТЧДокумента Из СтрокиДокумента Цикл

			// Здесь заполняем табличную часть документа
			Номенклатура	 = СтрокаТЧДокумента.Номенклатура;
			Цена			 = СтрокаТЧДокумента.Цена;
			Количество	 = СтрокаТЧДокумента.Количество;
			СтавкаНДС	 = СтрокаТЧДокумента.СтавкаНДС;   
			
			Сообщить("Номенклатура "+Номенклатура);
			Сообщить("Цена "+Цена);
			Сообщить("Количество "+Количество);
			Сообщить("СтавкаНДС "+СтавкаНДС);
			
		КонецЦикла;  
		
		// Здесь записываем документ
		
	КонецЦикла;
Показать
user1C99; +1 Ответить
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Sashares 35 18.09.23 14:18 Сейчас в теме
(1) Например, прочитать в таблицу, отсортировать таблицу по номеру документа и дате.
При обходе таблицы в цикле если номер и дата в строке таблицы отличается от номера и даты в предыдущей строке, то создавать новый документ.
user1881120; +1 Ответить
11. user1C99 18.09.23 15:07 Сейчас в теме
50. independ 1538 20.09.23 22:56 Сейчас в теме
(1) без программирования, если документов немного, то открыть dbf в excel, сохранить нужные строки в отдельные файлы, и с помощью стандартной обработки загрузки из xls создать нужные поступления
p.s. можно прямо из dbf
58. user856012 13 21.09.23 11:02 Сейчас в теме
(57)
зачем-то приплел перебор dbf по индексам
Может, затем, что в вашем коде DBF никак не фигурирует, от слова "совсем"? Хотя в исходном ТЗ вроде ясно сказано:
Есть DBF файл с колонками "Номер документа", "Дата документа", "ИНН Контрагента", "Номенклатура", "Цена", "Количество", "Ставка НДС" и "Сумма".

Что же касается "перебора по индексам", то тут все не так очевидно, пока что сохраним интригу...
3. пользователь 18.09.23 14:52
Сообщение было скрыто модератором.
...
4. user1C99 18.09.23 14:54 Сейчас в теме
(3)Покажи класс "программист".
5. пользователь 18.09.23 14:56
Сообщение было скрыто модератором.
...
6. user1C99 18.09.23 14:58 Сейчас в теме
(5)Ты себя переоцениваешь.
7. пользователь 18.09.23 14:59
Сообщение было скрыто модератором.
...
8. user1C99 18.09.23 15:04 Сейчас в теме
(7)Платят за неуважение к людям, которые задают вопросы на форуме, который для этого и предназначен, чтобы найти ответы? Или за попытку самоутвердиться, только не пойму одного, если тебе платят, то почему ты сейчас не занят работой, а сидишь здесь и пытаешься втюхать какую-то чушь про свою "космическую востребованность"?
10. пользователь 18.09.23 15:07
Сообщение было скрыто модератором.
...
14. пользователь 18.09.23 15:13
Сообщение было скрыто модератором.
...
17. пользователь 18.09.23 15:14
Сообщение было скрыто модератором.
...
18. пользователь 18.09.23 15:15
Сообщение было скрыто модератором.
...
20. Torin57 7 18.09.23 15:15 Сейчас в теме
(17) Лучше подскажи почему у меня код получился неразноцветным? Что подправить надо?
22. Sashares 35 18.09.23 15:18 Сейчас в теме
40. пользователь 18.09.23 15:35
Сообщение было скрыто модератором.
...
42. Sashares 35 18.09.23 15:44 Сейчас в теме
(40)Написал в тех.поддержку про это.
23. пользователь 18.09.23 15:19
Сообщение было скрыто модератором.
...
21. user856012 13 18.09.23 15:17 Сейчас в теме
(8)
Платят за неуважение к людям, которые задают вопросы на форуме, который для этого и предназначен, чтобы найти ответы?
Ну вот, как я и предупреждал в (26) в недавней дискуссии.

И ведь не новичок...
25. пользователь 18.09.23 15:20
Сообщение было скрыто модератором.
...
27. пользователь 18.09.23 15:22
Сообщение было скрыто модератором.
...
30. пользователь 18.09.23 15:24
Сообщение было скрыто модератором.
...
31. пользователь 18.09.23 15:25
Сообщение было скрыто модератором.
...
33. пользователь 18.09.23 15:26
Сообщение было скрыто модератором.
...
37. пользователь 18.09.23 15:29
Сообщение было скрыто модератором.
...
39. пользователь 18.09.23 15:32
Сообщение было скрыто модератором.
...
41. пользователь 18.09.23 15:40
Сообщение было скрыто модератором.
...
44. пользователь 18.09.23 15:46
Сообщение было скрыто модератором.
...
46. пользователь 18.09.23 15:53
Сообщение было скрыто модератором.
...
43. user1936670 18.09.23 15:44 Сейчас в теме
(8)
на форуме, который для этого и предназначен, чтобы найти ответы
Ну, то есть для написания ответов форум не предназначен. Я так и знал.
Sashares; user1990628; +2 Ответить
45. пользователь 18.09.23 15:51
Сообщение было скрыто модератором.
...
54. Torin57 7 21.09.23 09:44 Сейчас в теме
(43)
Ну, то есть для написания ответов форум не предназначен. Я так и знал.

Автор не пытался дать исчерпывающий ответ для чего предназначен форум.
Ты хотел выразить свою точку зрения или точку зрения автора? Ну про тебя-то и так все понятно. Ты сам рассказал для чего пользуешься форумом. А про автора спорное утверждение.
9. alexey123perm 21 18.09.23 15:05 Сейчас в теме
(1). Другой вариант: Поместить таблицу значений в запрос и сгруппировать по ИНН контрагента и номеру и дате документа, например. Тогда не надо будет проверять совпадение номеров и дат
12. user1C99 18.09.23 15:08 Сейчас в теме
13. пользователь 18.09.23 15:09
Сообщение было скрыто модератором.
...
16. user1C99 18.09.23 15:14 Сейчас в теме
(13)Кто бота впустил? Теперь после него проветривать придётся.
26. пользователь 18.09.23 15:22
Сообщение было скрыто модератором.
...
28. пользователь 18.09.23 15:23
Сообщение было скрыто модератором.
...
32. пользователь 18.09.23 15:25
Сообщение было скрыто модератором.
...
34. пользователь 18.09.23 15:27
Сообщение было скрыто модератором.
...
36. пользователь 18.09.23 15:29
Сообщение было скрыто модератором.
...
15. Torin57 7 18.09.23 15:14 Сейчас в теме
У меня получился вот такой код. Помещаю таблицу значений в запрос и использую конструкцию ИТОГИ ПО по номеру и дате. Дальше выборка с обходом результата запроса по группировке "НомерИДата"

	ТипСтрока50 = Новый ОписаниеТипов("Строка", ,
	 Новый КвалификаторыСтроки(50, ДопустимаяДлина.Переменная));
	 
	 ТипЧисло10_2 =Новый ОписаниеТипов("Число",
				 Новый КвалификаторыЧисла(10, 2, ДопустимыйЗнак.Любой));	 
				 
	ТаблицаЗначений = Новый ТаблицаЗначений;
	ТаблицаЗначений.Колонки.Добавить("НомерДокумента", ТипСтрока50);
	ТаблицаЗначений.Колонки.Добавить("ДатаДокумента", ТипСтрока50);
	ТаблицаЗначений.Колонки.Добавить("ИННКонтрагента", ТипСтрока50);
	ТаблицаЗначений.Колонки.Добавить("Номенклатура", ТипСтрока50);
	ТаблицаЗначений.Колонки.Добавить("Цена", ТипЧисло10_2);
	ТаблицаЗначений.Колонки.Добавить("Количество", ТипЧисло10_2);
	ТаблицаЗначений.Колонки.Добавить("СтавкаНДС", ТипЧисло10_2);
	ТаблицаЗначений.Колонки.Добавить("Сумма", ТипЧисло10_2);
	
	ТаблицаЗначений.Добавить();
	ТаблицаЗначений[0].НомерДокумента = "Документ1";
	ТаблицаЗначений[0].ДатаДокумента = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
	ТаблицаЗначений[0].ИННКонтрагента = "1234567890";
	ТаблицаЗначений[0].Номенклатура = "Товар1";
	ТаблицаЗначений[0].Цена = 1000;
	ТаблицаЗначений[0].Количество = 5;
	ТаблицаЗначений[0].СтавкаНДС = 20;
	ТаблицаЗначений[0].Сумма = ТаблицаЗначений[0].Цена * ТаблицаЗначений[0].Количество;
	
	ТаблицаЗначений.Добавить();
	ТаблицаЗначений[1].НомерДокумента = "Документ1";
	ТаблицаЗначений[1].ДатаДокумента = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
	ТаблицаЗначений[1].ИННКонтрагента = "1234567890";
	ТаблицаЗначений[1].Номенклатура = "Товар2";
	ТаблицаЗначений[1].Цена = 1500;
	ТаблицаЗначений[1].Количество = 3;
	ТаблицаЗначений[1].СтавкаНДС = 10;
	ТаблицаЗначений[1].Сумма = ТаблицаЗначений[1].Цена * ТаблицаЗначений[1].Количество;
	
	ТаблицаЗначений.Добавить();
	ТаблицаЗначений[2].НомерДокумента = "Документ3";
	ТаблицаЗначений[2].ДатаДокумента = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
	ТаблицаЗначений[2].ИННКонтрагента = "5432167890";
	ТаблицаЗначений[2].Номенклатура = "Товар3";
	ТаблицаЗначений[2].Цена = 2000;
	ТаблицаЗначений[2].Количество = 2;
	ТаблицаЗначений[2].СтавкаНДС = 20;
	ТаблицаЗначений[2].Сумма = ТаблицаЗначений[2].Цена * ТаблицаЗначений[2].Количество;
	
	ТаблицаЗначений.Добавить();
	ТаблицаЗначений[3].НомерДокумента = "Документ4";
	ТаблицаЗначений[3].ДатаДокумента = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
	ТаблицаЗначений[3].ИННКонтрагента = "0987654321";
	ТаблицаЗначений[3].Номенклатура = "Товар4";
	ТаблицаЗначений[3].Цена = 3000;
	ТаблицаЗначений[3].Количество = 1;
	ТаблицаЗначений[3].СтавкаНДС = 10;
	ТаблицаЗначений[3].Сумма = ТаблицаЗначений[3].Цена * ТаблицаЗначений[3].Количество;
	
	//{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
	// Данный фрагмент построен конструктором.
	// При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
	
	Запрос = Новый Запрос;
	Запрос.Текст = 
	"ВЫБРАТЬ
	|	ТЗ.НомерДокумента КАК НомерДокумента,
	|	ТЗ.ДатаДокумента КАК ДатаДокумента,
	|	ТЗ.ИННКонтрагента КАК ИННКонтрагента,
	|	ТЗ.Номенклатура КАК Номенклатура,
	|	ТЗ.Цена КАК Цена,
	|	ТЗ.Количество КАК Количество,
	|	ТЗ.СтавкаНДС КАК СтавкаНДС,
	|	ТЗ.Сумма КАК Сумма
	|ПОМЕСТИТЬ Врем_ТЗ
	|ИЗ
	|	&ТЗ КАК ТЗ
	|;
	|
	|////////////////////////////////////////////////////////////­////////////////////
	|ВЫБРАТЬ
	|	Врем_ТЗ.НомерДокумента + ""_"" + Врем_ТЗ.ДатаДокумента КАК НомерИДата,
	|	Врем_ТЗ.НомерДокумента КАК НомерДокумента,
	|	Врем_ТЗ.ДатаДокумента КАК ДатаДокумента,
	|	Врем_ТЗ.ИННКонтрагента КАК ИННКонтрагента,
	|	Врем_ТЗ.Номенклатура КАК Номенклатура,
	|	Врем_ТЗ.Цена КАК Цена,
	|	Врем_ТЗ.Количество КАК Количество,
	|	Врем_ТЗ.СтавкаНДС КАК СтавкаНДС,
	|	Врем_ТЗ.Сумма КАК Сумма
	|ИЗ
	|	Врем_ТЗ КАК Врем_ТЗ
	|ИТОГИ
	|	МАКСИМУМ(НомерДокумента),   // Нужно для того чтобы вывести НомерДокумента в группировке по ""НомерИДата"". Такой хитрый трюк
	|	МАКСИМУМ(ДатаДокумента),   // Нужно для того чтобы вывести ДатаДокумента в группировке по ""НомерИДата"".  Такой хитрый трюк
	|	МАКСИМУМ(ИННКонтрагента),   // Нужно для того чтобы вывести ИННКонтрагента в группировке по ""НомерИДата"".  Такой хитрый трюк
	|	СУММА(Сумма)
	|ПО
	|	НомерИДата";   
	
	Запрос.УстановитьПараметр("ТЗ", ТаблицаЗначений);
 	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВыборкаДокумент = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "НомерИДата");
	
	Пока ВыборкаДокумент.Следующий() Цикл         
		
		// Здесь создаем документ
		НомерДок			= ВыборкаДокумент.НомерДокумента;
		ДатаДок			= ВыборкаДокумент.ДатаДокумента;
		ИННКонтрагента	= ВыборкаДокумент.ИННКонтрагента;
		ОбщаяСумма		= ВыборкаДокумент.Сумма;
		ВыборкаДетальныеЗаписи = ВыборкаДокумент.Выбрать();  
		
		Сообщить("НомерДок "+НомерДок);
		Сообщить("ДатаДок "+ДатаДок);
		Сообщить("ИННКонтрагента "+ИННКонтрагента);
		Сообщить("ОбщаяСумма "+ОбщаяСумма);
		
		Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
			// Здесь заполняем табличную часть документа
			Номенклатура	 = ВыборкаДетальныеЗаписи.Номенклатура;
			Цена			 = ВыборкаДетальныеЗаписи.Цена;
			Количество	 = ВыборкаДетальныеЗаписи.Количество;
			СтавкаНДС	 = ВыборкаДетальныеЗаписи.СтавкаНДС;
			Сообщить("Номенклатура "+Номенклатура);
			Сообщить("Цена "+Цена);
			Сообщить("Количество "+Количество);
			Сообщить("СтавкаНДС "+СтавкаНДС);
		КонецЦикла;
		
	КонецЦикла;
	
	//}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
Показать
19. пользователь 18.09.23 15:15
Сообщение было скрыто модератором.
...
24. Torin57 7 18.09.23 15:20 Сейчас в теме
(19) Есть грех. Заняться есть чем на работе, а я тут сижу. Частично Chat gpt код написал, но все равно время потратил.
user1881120; +1 Ответить
29. пользователь 18.09.23 15:23
Сообщение было скрыто модератором.
...
35. пользователь 18.09.23 15:28
Сообщение было скрыто модератором.
...
38. пользователь 18.09.23 15:30
Сообщение было скрыто модератором.
...
47. Torin57 7 20.09.23 21:04 Сейчас в теме
Есть еще такой вариант.

	
ТипСтрока50 = Новый ОписаниеТипов("Строка", ,
	 Новый КвалификаторыСтроки(50, ДопустимаяДлина.Переменная));
	 
	 ТипЧисло10_2 =Новый ОписаниеТипов("Число",
				 Новый КвалификаторыЧисла(10, 2, ДопустимыйЗнак.Любой));	 
				 
	ТаблицаЗначений = Новый ТаблицаЗначений;
	ТаблицаЗначений.Колонки.Добавить("НомерДокумента", ТипСтрока50);
	ТаблицаЗначений.Колонки.Добавить("ДатаДокумента", ТипСтрока50);
	ТаблицаЗначений.Колонки.Добавить("ИННКонтрагента", ТипСтрока50);
	ТаблицаЗначений.Колонки.Добавить("Номенклатура", ТипСтрока50);
	ТаблицаЗначений.Колонки.Добавить("Цена", ТипЧисло10_2);
	ТаблицаЗначений.Колонки.Добавить("Количество", ТипЧисло10_2);
	ТаблицаЗначений.Колонки.Добавить("СтавкаНДС", ТипЧисло10_2);
	ТаблицаЗначений.Колонки.Добавить("Сумма", ТипЧисло10_2);
	
	ТаблицаЗначений.Добавить();
	ТаблицаЗначений[0].НомерДокумента = "Документ1";
	ТаблицаЗначений[0].ДатаДокумента = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
	ТаблицаЗначений[0].ИННКонтрагента = "1234567890";
	ТаблицаЗначений[0].Номенклатура = "Товар1";
	ТаблицаЗначений[0].Цена = 1000;
	ТаблицаЗначений[0].Количество = 5;
	ТаблицаЗначений[0].СтавкаНДС = 20;
	ТаблицаЗначений[0].Сумма = ТаблицаЗначений[0].Цена * ТаблицаЗначений[0].Количество;
	
	ТаблицаЗначений.Добавить();
	ТаблицаЗначений[1].НомерДокумента = "Документ1";
	ТаблицаЗначений[1].ДатаДокумента = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
	ТаблицаЗначений[1].ИННКонтрагента = "1234567890";
	ТаблицаЗначений[1].Номенклатура = "Товар2";
	ТаблицаЗначений[1].Цена = 1500;
	ТаблицаЗначений[1].Количество = 3;
	ТаблицаЗначений[1].СтавкаНДС = 10;
	ТаблицаЗначений[1].Сумма = ТаблицаЗначений[1].Цена * ТаблицаЗначений[1].Количество;
	
	ТаблицаЗначений.Добавить();
	ТаблицаЗначений[2].НомерДокумента = "Документ3";
	ТаблицаЗначений[2].ДатаДокумента = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
	ТаблицаЗначений[2].ИННКонтрагента = "5432167890";
	ТаблицаЗначений[2].Номенклатура = "Товар3";
	ТаблицаЗначений[2].Цена = 2000;
	ТаблицаЗначений[2].Количество = 2;
	ТаблицаЗначений[2].СтавкаНДС = 20;
	ТаблицаЗначений[2].Сумма = ТаблицаЗначений[2].Цена * ТаблицаЗначений[2].Количество;
	
	ТаблицаЗначений.Добавить();
	ТаблицаЗначений[3].НомерДокумента = "Документ4";
	ТаблицаЗначений[3].ДатаДокумента = Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
	ТаблицаЗначений[3].ИННКонтрагента = "0987654321";
	ТаблицаЗначений[3].Номенклатура = "Товар4";
	ТаблицаЗначений[3].Цена = 3000;
	ТаблицаЗначений[3].Количество = 1;
	ТаблицаЗначений[3].СтавкаНДС = 10;
	ТаблицаЗначений[3].Сумма = ТаблицаЗначений[3].Цена * ТаблицаЗначений[3].Количество;
	
	ТабДокументы = ТаблицаЗначений.Скопировать();
	ТабДокументы.Свернуть("НомерДокумента, ДатаДокумента, ИННКонтрагента", "Сумма");
	
	Для каждого ТекДокумент Из ТабДокументы Цикл
		
		// Здесь создаем документ
		НомерДок			= ТекДокумент.НомерДокумента;
		ДатаДок			= ТекДокумент.ДатаДокумента;
		ИННКонтрагента	= ТекДокумент.ИННКонтрагента;
		ОбщаяСумма		= ТекДокумент.Сумма;
		
		Сообщить("НомерДок "+НомерДок);
		Сообщить("ДатаДок "+ДатаДок);
		Сообщить("ИННКонтрагента "+ИННКонтрагента);
		Сообщить("ОбщаяСумма "+ОбщаяСумма);

		ОтборСтрокТекущегоДокумента = Новый Структура;
		ОтборСтрокТекущегоДокумента.Вставить("НомерДокумента",	  НомерДок);
		ОтборСтрокТекущегоДокумента.Вставить("ДатаДокумента",	  ДатаДок);
		
		СтрокиДокумента = ТаблицаЗначений.НайтиСтроки(ОтборСтрокТекущегоДокумента);
		
		Для каждого СтрокаТЧДокумента Из СтрокиДокумента Цикл

			// Здесь заполняем табличную часть документа
			Номенклатура	 = СтрокаТЧДокумента.Номенклатура;
			Цена			 = СтрокаТЧДокумента.Цена;
			Количество	 = СтрокаТЧДокумента.Количество;
			СтавкаНДС	 = СтрокаТЧДокумента.СтавкаНДС;   
			
			Сообщить("Номенклатура "+Номенклатура);
			Сообщить("Цена "+Цена);
			Сообщить("Количество "+Количество);
			Сообщить("СтавкаНДС "+СтавкаНДС);
			
		КонецЦикла;  
		
		// Здесь записываем документ
		
	КонецЦикла;
Показать
user1C99; +1 Ответить
48. user1936667 20.09.23 21:59 Сейчас в теме
(47) А ваш ChatGPT про перебор dbf по индексам что-нибудь знает? Или тут ситуация как с поиском новичками на форуме?
49. Torin57 7 20.09.23 22:07 Сейчас в теме
51. user1936667 20.09.23 23:13 Сейчас в теме
(49)
Что за ситуация?

Как говорил один Torin57:

Новички ленятся пользоваться поиском, а старожилы ленятся объяснять по каким ключевым словам искать. Типа он сам догадается. Да не догадается. Большинство людей и невнимательны и не сообразительны. Просто у нас в этом сознаваться не принято.


http://forum.infostart.ru/forum1/topic303254/message3003074/#message3003074
52. Torin57 7 21.09.23 09:27 Сейчас в теме
(51) Я просто не знаю как это сделать. Перегнать dbf в таблицу значений. Поиск приводит сюда, но я сам не пробовал.
https://infostart.ru/1c/articles/103060/
53. Torin57 7 21.09.23 09:33 Сейчас в теме
(48)
А ваш ChatGPT про перебор dbf по индексам что-нибудь знает?

Индексы нужно для скорости. А тут что, нужно ускорение? Что там у автора? Тысячи тысяч строк в dbf?
62. user1C99 21.09.23 16:41 Сейчас в теме
(47) Спасибо вам большое, вы мне очень помогли, воспользовавшись Вашим шаблоном я смог сделать так как мне нужно было. Еще раз спасибо.
55. Torin57 7 21.09.23 09:57 Сейчас в теме
В дополнение к (52). Забил в яндексе "Перегнать dbf в таблицу значений".
56. jmw 60 21.09.23 10:35 Сейчас в теме
Тема поднята 18 числа.
Неужто не смогли включить голову, чтобы написать хоть что-то самому?
Таблицу значений можно самому заполнить за пять минут кода:
т = Новый ТаблицаЗначений();
т.Колонки.Добавить("Номер");
т.Колонки.Добавить("Дата");
т.Колонки.Добавить("ИНН");
т.Колонки.Добавить("тч");

тч = Новый ТаблицаЗначений();
тч.Колонки.Добавить("Наименование");
тч.Колонки.Добавить("Цена");
тч.Колонки.Добавить("Количество");
тч.Колонки.Добавить("НДС");
тч.Колонки.Добавить("Сумма");
тч = ЗначениеВСтрокуВнутр(тч);

имяБазы = "M:\Elected.DBF";
база = Новый XBase(имяБазы);
Пока НЕ база.ВКонце() Цикл
	
	стр = т.Найти(база.NOMER, "Номер");
	Если стр = Неопределено Тогда
		стр = т.Добавить();
		стр.Номер = база.NOMER;
		стр.Дата  = база.DATE;
		стр.ИНН   = база.INN;
		стр.тч = ЗначениеИзСтрокиВнутр(тч);
	КонецЕсли;
	
	стрТЧ = стр.тч.Добавить();
	стрТЧ.Наименование = база.NAME;
	стрТЧ.Цена         = база.PRICE;
	стрТЧ.Количество   = база.COUNT;
	стрТЧ.НДС          = база.VAT;
	стрТЧ.Сумма        = база.SUM;
	
	база.Следующая();
КонецЦикла;
база.ЗакрытьФайл();

Для каждого стр из т Цикл
	Сообщить("Документ № " + стр.Номер + " от " + стр.Дата + " ИНН " + стр.ИНН);
	Для каждого стрТЧ из стр.тч Цикл
		Сообщить("    " + стр.Наименование + " : " + стр.Цена + " · " + стр.Количество + " = " + стр.Сумма + "    НДС " + стр.НДС);
	КонецЦикла;
КонецЦикла;

Сообщить("Всё!");
Показать
57. Torin57 7 21.09.23 10:44 Сейчас в теме
(56)
Неужто не смогли включить голову, чтобы написать хоть что-то самому?

IT как раз для этого и нужно. Чтобы дать отдых мозгам. Но большинство думает иначе. Усложняет на пустом месте. Как например user1936667 20.09.23 21:59 в этой ветке зачем-то приплел перебор dbf по индексам. Ну можно что-то такое замутить. На какую-то милисекунду, условно говоря, будет быстрее. Только зачем?
59. user1936667 21.09.23 15:07 Сейчас в теме
(57)
Как например user1936667 20.09.23 21:59 в этой ветке зачем-то приплел перебор dbf по индексам

Ничего не меняется. Тупые пытаются обучать тупых, привлекая для этого красивые и модные нейрообертки и наяривая на своё незнание. Перекрестное опыление, инцухт, инцест и вырождение собщества...

Индексы нужны для упорядочивания, это позволяет обойтись без ваших таблиц значений вообще и группировать данные прямо при чтении.

Смотри, воинствующее невежество, это будет не очень сложно:

&НаКлиенте
Процедура Команда1(Команда)
	
	Команда1НаСервере();
	
КонецПроцедуры

&НаСервере
Процедура Команда1НаСервере()
	
	ОписаниеФайла = НовыйФайлДанных();
	
	ФайлДанных = Новый XBase(ОписаниеФайла.ПутьКБазе, ОписаниеФайла.ПутьКИндексу, Истина);
	
	ФайлДанных.ТекущийИндекс = ФайлДанных.Индексы.IDX;
	ЕстьСтроки = ФайлДанных.Первая();
	
	ТекущийНомер = Неопределено;
	Пока ЕстьСтроки Цикл
		НомерДокумента = ФайлДанных.DOCNUM;
		Если НомерДокумента <> ТекущийНомер Тогда
			Сообщить("Создан новый документ №" + НомерДокумента);
			ТекущийНомер = НомерДокумента;
		КонецЕсли;
			
		НомерСтроки = ФайлДанных.LINENUM; 
		Сообщить("    " + НомерСтроки);
		
		ЕстьСтроки = ФайлДанных.Следующая();
	КонецЦикла;
	
	ФайлДанных.ЗакрытьФайл();
	УдалитьФайлДанных(ОписаниеФайла);
	
КонецПроцедуры

Функция НовыйФайлДанных()
	
	Каталог = ПолучитьИмяВременногоФайла();
	СоздатьКаталог(Каталог);
	
	ПутьКБазе = Каталог + "\test.dbf";
	ПутьКИндексу = Каталог + "\test.cdx";
	
	ФайлДанных = Новый XBase;
	ФайлДанных.Поля.Добавить("DOCNUM", "N", 10, 0);
	ФайлДанных.Поля.Добавить("LINENUM", "N", 10, 0);
	
	ФайлДанных.Индексы.Добавить("IDX", "STR(DOCNUM, 10) + STR(LINENUM, 10)");
	
	ФайлДанных.СоздатьФайл(ПутьКБазе, ПутьКИндексу);
	ФайлДанных.АвтоСохранение = Истина;
	
	ФайлДанных.Добавить();
	ФайлДанных.DOCNUM = 2;
	ФайлДанных.LINENUM = 1;

	ФайлДанных.Добавить();
	ФайлДанных.DOCNUM = 2;
	ФайлДанных.LINENUM = 2;

	ФайлДанных.Добавить();
	ФайлДанных.DOCNUM = 1;
	ФайлДанных.LINENUM = 3;

	ФайлДанных.Добавить();
	ФайлДанных.DOCNUM = 1;
	ФайлДанных.LINENUM = 2;
	
	ФайлДанных.Добавить();
	ФайлДанных.DOCNUM = 1;
	ФайлДанных.LINENUM = 1;

	ФайлДанных.ЗакрытьФайл();
	
	Описание = Новый Структура;
	Описание.Вставить("Каталог", Каталог);
	Описание.Вставить("ПутьКБазе", ПутьКБазе);
	Описание.Вставить("ПутьКИндексу", ПутьКИндексу);
	
	Возврат Описание;
	
КонецФункции

Функция УдалитьФайлДанных(ОписаниеФайла)
	
	УдалитьФайлы(ОписаниеФайла.Каталог);
	
КонецФункции
Показать
user1826630; +1 Ответить
60. Torin57 7 21.09.23 15:34 Сейчас в теме
(59) Добавь, пож-та, еще комментарий где документ создается, где добавляются строки, где документ записывается.
61. user856012 13 21.09.23 15:46 Сейчас в теме
(59)
Индексы нужны для упорядочивания
Вот-вот, именно это я и подразумевал в (58), потому что в (1) никак не обозначено, что записи в DBF, относящиеся к одному документу, будут идти подряд.
(60)
Добавь, пож-та, еще комментарий где документ создается, где добавляются строки, где документ записывается.
"Сама-сама-сама! Не в ресторане, самообслуживание!" (с)
64. Torin57 7 21.09.23 17:22 Сейчас в теме
(59) То есть для того чтобы раскрутить тебя на написание кода мне пришлось проявить воинствующее невежество. Так что ли с вами разговаривать?

Перекрестное опыление, инцухт, инцест и вырождение собщества...


Так ты же первый к этому руку прилагаешь.
63. Torin57 7 21.09.23 16:59 Сейчас в теме
(61) "Пивная, ещё парочку" (с) :)
65. user645801_yyyuuu123q 25.09.23 03:38 Сейчас в теме
Судя по всему проще всего сделать так
Создай новое соответствие
Читай файл, если в соответствии уже есть повторяющие наименование тогда в массив добавляй значение
и так далее

В каждом соответствии будет ключ наименование и значение массив. По итогу ты получишь то что хотел
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот