Заполнение табличной части справочника - данные из предыдущей строки для следующей

1. Morikama 11.09.21 11:22 Сейчас в теме
Друзья, здравствуйте! Помогите, пожалуйста, вторые сутки ломаю голову. Опыта в прогр. почти нет.
Задача - заполнить табличную часть справочника, в частности - одним махом наделать строчек с расписанием периодического техобслуживания.
Для первой строки отталкиваемся от объекта "Дата производства", а вот как обратиться к следующим - чёрт знает.
Смысл в заполнении дат. Для каждой новой строки необходимо отсчитать дату начала очередного ТО с учётом интервала.
Написал код, первая строка заполняется. А вот что писать для следующих - не очень понимаю. Версия 8.3.18, управляемое прилож.

&НаКлиенте
Процедура ДатаПроизводстваПриИзменении()
	 ДатаПроизводстваПриИзмененииНаСервере();
	
	 Если ЗначениеЗаполнено(Объект.НКСС) Тогда
	 Объект.ДатаИстечСЛГ = ДобавитьМесяц(Объект.ДатаПроизводства, 12 * Объект.НКСС);
	 ДатаИстечСЛГПриИзмененииНаСервере();
 КонецЕсли;
 
 	ТекСтрока = Элементы.РаписаниеПТО.ТекущиеДанные;
	                  			
	НовСтрока = Объект.РасписаниеПТО.Добавить();

Для Каждого ТекСтрока из Объект.РасписаниеПТО Цикл
	
	НовСтрока.ДатаНачТОплан = Объект.ДатаПроизводства +  Объект.ФормаАинтервал * 86400;
	НовСтрока.ПродолжТО = Объект.ФормаАпродолж * 60 * 60;
	НовСтрока.ДатаОКТОплан = ТекСтрока.ДатаНачТОплан + ТекСтрока.ПродолжТО;
	НовСтрока.ФормаТО = "ФормаА";
КонецЦикла;
Показать
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
31. Dимыч 11.09.21 21:03 Сейчас в теме
(30)
Строку
Пока ДатаНачала < ДатаИстеченияСЛГ Цикл

заменить на
Пока ДатаНачала + Объект.ФормаАинтервал * 86400 < ДатаИстеченияСЛГ Цикл
32. Morikama 11.09.21 21:06 Сейчас в теме
(26) Корректно работает, если так:
ДатаИстеченияСЛГ = Объект.ДатаИстечСЛГ - 2592000; т.е. в секундах отминусовать 30 дней от даты истечения )
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. FatPanzer 11.09.21 11:33 Сейчас в теме
Запоминайте дату в отдельной переменной, в цикле её увеличивайте на нужный интервал и присваивайте реквизиту табличной строки...
3. Morikama 11.09.21 11:54 Сейчас в теме
(2) О боже... Если б я хоть что-то понимал в этих переменных. Код как должен выглядеть в этом случае?
5. FatPanzer 11.09.21 12:38 Сейчас в теме
(3) Код должен выглядеть так, как его напишет нанятый вами программист. Ну, раз уж вы не понимаете слова "переменная"...
DJ_Codebase; +1 Ответить
6. Morikama 11.09.21 12:54 Сейчас в теме
(5) Ну... как-то для учебных целей и разработок нанимать программиста - это, избыточно, что ли...
7. FatPanzer 11.09.21 13:02 Сейчас в теме
(6) Ааа... То есть вы в процессе учебы не собираетесь понимать, что такое переменная, а сразу хотите получить готовый чужой код?
Какое-то хреновое у вас представление об обучении...
DJ_Codebase; +1 Ответить
11. Morikama 11.09.21 13:20 Сейчас в теме
(7) Вы написали про переменную и я стал искать и смотреть. Пока я не понимаю, для чего она здесь. По сути-то нужно взять значение из определённого столбца предыдущей строки и от него отсчитать интервал

ПредыдущееЗначение = НовСтрока.ПродолжТО;

и ничего не выходит...
12. FatPanzer 11.09.21 13:27 Сейчас в теме
НовСтрока = Объект.РасписаниеПТО.Добавить();

Для Каждого ТекСтрока из Объект.РасписаниеПТО Цикл
    
    НовСтрока.ДатаНачТОплан = Объект.ДатаПроизводства +  Объект.ФормаАинтервал * 86400;
    НовСтрока.ПродолжТО = Объект.ФормаАпродолж * 60 * 60;
    НовСтрока.ДатаОКТОплан = ТекСтрока.ДатаНачТОплан + ТекСтрока.ПродолжТО;
    НовСтрока.ФормаТО = "ФормаА";
КонецЦикла;
Показать

Вот эту хрень можно просто заменить на
НовСтрока = Объект.РасписаниеПТО.Добавить();
НовСтрока.ДатаНачТОплан = Объект.ДатаПроизводства +  Объект.ФормаАинтервал * (86400 * Объект.РасписаниеПТО.Количество();
НовСтрока.ПродолжТО = Объект.ФормаАпродолж * 60 * 60 * Объект.РасписаниеПТО.Количество();
НовСтрока.ДатаОКТОплан = ТекСтрока.ДатаНачТОплан + ТекСтрока.ПродолжТО;
НовСтрока.ФормаТО = "ФормаА";
4. burgomister 59 11.09.21 12:21 Сейчас в теме
// всего четыре строки надо
ПредыдущееЗначение = 0;
Для Индекс = 1 По 4 Цикл

    НовСтрока = Объект.РасписаниеПТО.Добавить();
    
    НовСтрока.ДатаНачТОплан = Объект.ДатаПроизводства +  Объект.ФормаАинтервал * 86400;
    НовСтрока.ПродолжТО = Объект.ФормаАпродолж * 60 * 60;
    НовСтрока.ДатаОКТОплан = ТекСтрока.ДатаНачТОплан + ПредыдущееЗначение;
    НовСтрока.ФормаТО = "ФормаА";

   ПредыдущееЗначение = НовСтрока.ПродолжТО;
КонецЦикла;
Показать
8. Morikama 11.09.21 13:09 Сейчас в теме
(4)
ПредыдущееЗначение = 0;
Для Индекс = 1 По 4 Цикл

Я не очень понимаю, куда это надо вставить - до или после того, что я уже написал. Если после, то не считает
Вот в таком варианте выдаёт попросту 4 одинаковых даты.
ЧТо означает "Для Индекс = 1 По 4" ??
Логика в том, что как только введена дата производства, считается назнач. календарный срок службы - НКСС и становится известной дата окончания сертификата лётной годности (СЛГ). Вот после той даты уже ничего не должно происходить, то есть, цикл же не бесконечен. И вот как это и куда прописывать - чёрт знает... К тому же форм ТО аж 4 и надо расписать каждые.
9. user856012 14 11.09.21 13:14 Сейчас в теме
(8)
И вот как это и куда прописывать - чёрт знает...
Посмотрите на цифры з/п в разделе "Вакансии" (справа на главной странице форума) - среди них большинство шестизначные.

Как думаете, за что такие деньги работодатели готовы платить?

Подсказка: уж всяко не за "чёрт знает"...
DJ_Codebase; +1 Ответить
10. FatPanzer 11.09.21 13:16 Сейчас в теме
(8)
ЧТо означает "Для Индекс = 1 По 4" ??
Это означает наитипичнейшую организацию инкрементного цикла, которую проходят через 3 часа после начала обучения в любой школе программистов.
13. burgomister 59 11.09.21 13:31 Сейчас в теме
Так без цикла. Неправильно, конечно, но... работает. Надо только срок продолжительности ТО поправить.
Первый срок = ДатаНачТОплан + 30 * 86400
Второй срок = ДатаНачТОплан + 90 * 86400
Третий срок = ДобавитьМесяц(ТекДата, 12);
Четвертый срок = ДобавитьМесяц(ТекДата, 120);


    НовСтрока = Объект.РасписаниеПТО.Добавить();
    НовСтрока.ДатаНачТОплан = Объект.ДатаПроизводства +  Объект.ФормаАинтервал * 86400;
    НовСтрока.ПродолжТО = Объект.ФормаАпродолж * 60 * 60;
    НовСтрока.ДатаОКТОплан = ПервыйСрок;
    НовСтрока.ФормаТО = "ФормаА";

    НовСтрока = Объект.РасписаниеПТО.Добавить();
    НовСтрока.ДатаНачТОплан = Объект.ДатаПроизводства +  Объект.ФормаBинтервал * 86400;
    НовСтрока.ПродолжТО = Объект.ФормаBпродолж * 60 * 60;
    НовСтрока.ДатаОКТОплан = ВторойСрок;
    НовСтрока.ФормаТО = "ФормаB";

    НовСтрока = Объект.РасписаниеПТО.Добавить();
    НовСтрока.ДатаНачТОплан = Объект.ДатаПроизводства +  Объект.ФормаCинтервал * 86400;
    НовСтрока.ПродолжТО = Объект.ФормаCпродолж * 60 * 60;
    НовСтрока.ДатаОКТОплан = ТретийСрок;
    НовСтрока.ФормаТО = "ФормаC";

    НовСтрока = Объект.РасписаниеПТО.Добавить();
    НовСтрока.ДатаНачТОплан = Объект.ДатаПроизводства +  Объект.ФормаDинтервал * 86400;
    НовСтрока.ПродолжТО = Объект.ФормаDпродолж * 60 * 60;
    НовСтрока.ДатаОКТОплан = ЧетвертыйСрок;
    НовСтрока.ФормаТО = "ФормаD";
Показать
15. Morikama 11.09.21 17:14 Сейчас в теме
(13) Александр, нет, не работает без цикла. Выдаёт 4 строки и всё. Форма А - производится через каждые 30 дней, то есть в списке за 25 лет календарного срока службы она должна повториться как минимум 250 раз.
И ещё я не очень понял выражения ДобавитьМесяц(ТекДата, 12); - 1с просит имя переменной задать для "ТекДата", я по наитию поставил ТекущаяДата(), но не понимаю, при чём тут текущая дата.
Прикрепленные файлы:
19. burgomister 59 11.09.21 18:53 Сейчас в теме
(15) Не понял. Что не работает без цикла. В этом коде добавляются четыре строки в табличную часть справочника. Если вам надо обработать все элементы справочника, делайте по ним цикл и передавайте элемент справочника как объект. В чём проблема?
21. burgomister 59 11.09.21 19:03 Сейчас в теме
(19)
 Выборка = Справочники.Номенклатура.Выбрать();
 Пока Выборка.Следующий() = 1 Цикл
	Если Выборка.ЭтоГруппа Тогда
		Продолжить;
	КонецЕсли;

	ВыборкаОбъект = Выборка.ПолучитьОбъект();
      
	//  здесь код обработки элемента

КонецЦикла;
Показать
23. Morikama 11.09.21 19:57 Сейчас в теме
(21) Фух )) Я не понимаю, для чего обрабатывать все элементы справочника? На прикрепл. картинке в xls приведён пример того, что нужно - получить список дат проведения ТО, хрен бы с ним - только даты нужны, продолжительность не играет в этом справочнике особой роли. Но даже этого не получается. Можно сделать для каждой формы ТО отдельную табл. часть, можно общим списком вывести в одну ТЧ, не суть, важно, чтобы всё это заполнялось после заполнения объекта "ДатаПроизводства" и не выходило за рамки даты Окончания СЛГ (списания самолёта по возрасту).
Прикрепленные файлы:
26. Dимыч 11.09.21 20:19 Сейчас в теме
(23)
Попробуйте так, для вывода дат формы А должно получиться примерно следующее
ДатаНачала = Объект.ДатаПроизводства;
ДатаИстеченияСЛГ = ...//значение даты реквизита формы Дата истеч СЛГ
Пока ДатаНачала < ДатаИстеченияСЛГ Цикл
	НовСтрока = Объект.РасписаниеПТО.Добавить();
	НовСтрока.ДатаНачТОплан = ДатаНачала + Объект.ФормаАинтервал * 86400;
	НовСтрока.ПродолжТО = Объект.ФормаАпродолж * 60 * 60;
	НовСтрока.ДатаОКТОплан = ТекСтрока.ДатаНачТОплан + ТекСтрока.ПродолжТО;
	НовСтрока.ФормаТО = "ФормаА";
	ДатаНачала = НовСтрока.ДатаОКТОплан; 
КонецЦикла;
Показать
28. Morikama 11.09.21 20:41 Сейчас в теме
(26)
ДатаНачала = Объект.ДатаПроизводства;
...

При таком коде ругается "на ДатаОКТОплан"
Вот код полностью для этого события:
&НаКлиенте
Процедура ДатаПроизводстваПриИзменении()
	 ДатаПроизводстваПриИзмененииНаСервере();
	
	 Если ЗначениеЗаполнено(Объект.НКСС) Тогда
	 Объект.ДатаИстечСЛГ = ДобавитьМесяц(Объект.ДатаПроизводства, 12 * Объект.НКСС);
	 ДатаИстечСЛГПриИзмененииНаСервере();
 КонецЕсли;
 
 	ТекСтрока = Элементы.РаписаниеПТО.ТекущиеДанные;			
	ДатаНачала = Объект.ДатаПроизводства;
	ДатаИстеченияСЛГ = Объект.ДатаИстечСЛГ;
	Пока ДатаНачала < ДатаИстеченияСЛГ Цикл
	НовСтрока = Объект.РасписаниеПТО.Добавить();
	НовСтрока.ДатаНачТОплан = ДатаНачала + Объект.ФормаАинтервал * 86400;
	НовСтрока.ПродолжТО = Объект.ФормаАпродолж * 60 * 60;
	НовСтрока.ДатаОКТОплан = ТекСтрока.ДатаНачТОплан + ТекСтрока.ПродолжТО;
	НовСтрока.ФормаТО = "ФормаА";
	ДатаНачала = НовСтрока.ДатаОКТОплан; 
КонецЦикла;

КонецПроцедуры
Показать
Прикрепленные файлы:
29. Dимыч 11.09.21 20:45 Сейчас в теме
(28)
НовСтрока.ДатаОКТОплан = ТекСтрока.ДатаНачТОплан + ТекСтрока.ПродолжТО

заменить на
НовСтрока.ДатаОКТОплан = НовСтрока.ДатаНачТОплан + НовСтрока.ПродолжТО
30. Morikama 11.09.21 20:53 Сейчас в теме
(26) Ага, уже что-то
Заработало, если заменить
ДатаНачала = НовСтрока.ДатаОКТОплан;
на
ДатаНачала = НовСтрока.ДатаНачТОплан

Однако при этом всё-таки последняя дата формы А находится за пределами календарного срока службы
См. скрин.
Прикрепленные файлы:
31. Dимыч 11.09.21 21:03 Сейчас в теме
(30)
Строку
Пока ДатаНачала < ДатаИстеченияСЛГ Цикл

заменить на
Пока ДатаНачала + Объект.ФормаАинтервал * 86400 < ДатаИстеченияСЛГ Цикл
33. Morikama 11.09.21 21:07 Сейчас в теме
(31) спасибо, я уже выше написал, тоже как решение -
ДатаИстеченияСЛГ = Объект.ДатаИстечСЛГ - 2592000;
32. Morikama 11.09.21 21:06 Сейчас в теме
(26) Корректно работает, если так:
ДатаИстеченияСЛГ = Объект.ДатаИстечСЛГ - 2592000; т.е. в секундах отминусовать 30 дней от даты истечения )
14. starjevschik 11.09.21 17:02 Сейчас в теме
наймите программиста. 2 дня? эта задача уже обошлась вам в десяток тысяч р только прямых затрат, а еще от задержки внедрения прикиньте косвенные убытки. А цена задачи тысячи две. Считайте деньги, разделение труда не зря придумали капиталисты, это намного эффективнее.
16. Morikama 11.09.21 17:21 Сейчас в теме
(14) Какое ещё внедрение? ))) Это я делаю исключительно для себя и нескольких друзей и исключительно потому, что нахожусь в отпуске и свободен. В таблицах xls это всё считалось моментально и элементарно, но, к сожалению, Excel не подходит для других задач.
Можно вообще пойти другим путём - сделать расчёт в xls и загрузить в табличную часть, но хочется же сделать нормально. У меня друг-товарищ работает программистом почти 20 лет, но он не взялся за эту задачу, потому что тупо некогда. Он говорит, типа, там всё элементарно - сам разберёшься. Но боже ж мой 1с для меня - это ад. Чтобы вычислить несколько элементарных параметров - тонна кода.
17. FatPanzer 11.09.21 17:28 Сейчас в теме
(16) Нельзя браться за то, в чем не разбираетесь.
18. Morikama 11.09.21 18:05 Сейчас в теме
(17) А больше никто не хочет браться. Ну и потом немаловажную роль играет принцип "раз уж взялся, доведи до ума". По-моему, здесь не следует давать советы. Я пришёл на форум за помощью, хочу, прежде всего, разобраться в логике. И, разумеется, я не думал, что для простейшей задачи - к дате прибавить дату и время - придётся городить целый огород. Инженерно-штурманский расчёт я сделал куда быстрее, хотя там раза в 4 больше данных и параметров, и всё считается корректно, поэтому, когда брался за эту таблицу, я почему-то подумал, что ну уж с этим будет куда проще. Ан нет. Вначале мне советовали делать цикл методом обращения к предыдущей и последующим строкам через "ПредСтрока = ... " и "СледСтрока = ..." - и всё равно ничего не считалось, теперь здесь вот предлагаются другие решения, но и они тоже не рабочие.
20. FatPanzer 11.09.21 18:54 Сейчас в теме
(18) Ну, буде вам, в самом деле...
1. Помощь форума заключается в советах по подбору удочки, она не заключается в выдаче вам готовой поджаренной рыбы (вам поперчить?)
2. Задача на самом деле элементарнейшая. Просто вы не умеете пользоваться типовыми конструктами 1С, поэтому для вас она кажется адовой. А задача реально ни о чем.
3. Различия полученных вами советов исходят из того, что вы неоднозначно озвучили свою задачу, и не описали данные as is и данные to be. Поэтому - кто как понял, тот так и посоветовал. Но они хотя бы попытались помочь - уже за одно это необходимо отнестись к ним с уважением.
4. Вы привели некий свой программный код, который у всех специалистов вызывает недоумение (даже без знания описания вашей задачи).
5. Никто вам рабочее решение тут не даст, не понимая структуры ваших данных и описания алгоритма.
6. Вы признались в том, что ни хрена не разбираетесь в языке программирования 1С. И не хотите. Ну как бы - и зачем вам помогать? Вы же не пытаетесь стать нашим коллегой. Поэтому вам предложили за деньги обратиться к нашим коллегам. И вам спокойнее, и нам незачем время на вас тратить...
DJ_Codebase; burgomister; +2 Ответить
22. Morikama 11.09.21 19:35 Сейчас в теме
(20) Да что Вы снова о платных услугах? Это другой случай, я вам уже написал выше. Возможно, я неправильно сформулировал задачу, хотя мне так не кажется. При первом же взгляде на прикреплённый скрин, по-моему, всё логически должно быть ясно. То, что люди помогают, я не отрицаю и благодарю их за это, тем временем, ничего не работает толком, и это несмотря на то, что я пытаюсь всеми силами читать и разбираться в программном коде. Что значит "не хотите разбираться"? Вопрос не в этом, каждому человеку что-то интересно, что-то нет. Работать с данными в целом мне интересно, но писать программный код - нет. В этом случае для чего бы я пытался стать коллегой? Серьёзного программиста я буду нанимать для более сложных задач, пока в этом нет необходимости, т.к. я просто хочу понять логику - при помощи каких алгоритмов заполняется элементарная табличная часть справочника, все данные налицо.
24. FatPanzer 11.09.21 19:58 Сейчас в теме
(22)
при помощи каких алгоритмов заполняется элементарная табличная часть справочника, все данные налицо.
У вас проблем не в "элементарном заполнении ТЧ", у вас проблема в "как вычислить дату средствами 1С используя реквизиты объекта". Вам просто надо понимать объектную модель. Но вам это же ни к чему.
DJ_Codebase; +1 Ответить
25. Morikama 11.09.21 20:06 Сейчас в теме
(24) Как понять "ни к чему"? Вы написали "объектная модель", я про неё и читаю, насколько я понимаю, это вариант Запрос - выбрать. Но я, признаться, не понимаю, что выбирать в том случае, если данных нет? Цель же заполнить датами табличную часть, а не выбрать из неё что-либо...
27. DJ_Codebase 11.09.21 20:23 Сейчас в теме
(25)
я про неё и читаю

читать и понимать - не одно и то же. запрос это не объектная модель. придумали какую то непонятную для других задачу... вы не с этого обучение начали, надо азы познать, а потом уже вот к таким задачам может придете. может быть. но если оно вам не надо, просто забейте.
FatPanzer; +1 Ответить
34. Morikama 12.09.21 04:37 Сейчас в теме
(27) Друзья мои! Задача как задача ))) Как видите, чудом явился некто, скрывающийся под ником Димыч из города Нижнего Новгорода, который, кстати, я всегда вспоминаю с теплом, и всё решилось буквально за полчаса )) Получилась красота невероятная - заполняешь поле даты производства самолёта и получаешь плановое расписание всех форм ТО на весь его жизненный срок эксплуатации (на скрине).
Вообще, программисты народ весьма интересный, и товарищи зарубежные мало чем по психологии отличаются от наших соотечественников. В своё время я был бета-тестером одной довольно-таки симпатичной 2D-игрулины, стратегии под названием AirportCEO. Вёл весьма частую переписку с разработчиками. Знаете, что меня поразило? В некоторых случаях - элементарная лень и сведение многого к полному примитиву, плюс при явном наплевательском отношении к мелочам, которые, между прочим и украшают весь тот виртуальный мир, в который окунаются игроки, дикое желание праздно подебатировать. Пишу им, ребят, мол, поправьте мелочи - ну не бывает такого, чтобы оборотный рейс прилетал в разворотный аэропорт и улетал из него под одним и тем же номером рейса, он всегда отличается на единицу, поверьте мне, человеку, который 22 года проработал в системе организации авиаперевозок. Отвечают, дескать, ерунда, это не принципиально, какая разница, какой номер рейса? Ну как это, здрасьте? Потом выяснилось, что тот, кто взялся всё это делать, даже не имел представления о том, что бортовые регистрационные номера воздушных судов и номера рейсов - не есть одно и тоже. Это как и я не имею представления обо многом, что делается в 1С, но при этом я же не фукаю, а прислушиваюсь к специалистам, которые знают что к чему. Так мало того, сколько я бился над тем, чтобы они исправили явный ляп - нельзя заправлять самолёт топливом, если в нём сидят пассажиры. Ведь проще простого решить эту задачу - заправлен - посадка "да", не заправлен, выход на посадку закрыт. Два года мы над этим бились, упрашивали разработчиков. В результате в прошлом году релиз состоялся, с горем пополам, конечно, но играть как-то совершенно не интересно, реализм какой-то ущербный там. Поэтому я и решил сделать своё и исключительно для себя и небольшой группки людей, а там посмотрим, может и другим будет интересна такая вот инженерная игрулина.
Прикрепленные файлы:
Оставьте свое сообщение

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