автозаполнение ТЧ документа

1. Macarevich 13.12.18 21:52 Сейчас в теме
Здравствуйте! Есть справочник Катриджи с реквизитом СрокЭксплуатации(Число) и подчинённый ему справочник Принтеры. Регистры накопления(хранит остатки по катриджам), сведений(периодический, хранит значение ресурса ДатаСледОбслуживания(Дата) по Принтеру)

Документ ТехОбслуживания, у которого в ТЧ поля Принтер, Катридж, СрокЭксплуатации, Количество, ДатаСледОбслуживания.

Задачи:
1)При выборе поля Принтер, автоматом должны проставляться все остальные поля. Причём поле Количество всегда единица, а ДатаСледОбслуживания высчитывается так: "СрокЭксплуатации+24*60*60 + ТекущаяДата()". НО! Проблема в получении Владельца Принтера и реквизита Владельца.
Вопросы: Какой способ наиболее оптимальный: через запрос или отбор/выборку ? Как получить их через запрос ? Что оптимальнее для системы: передавать в процедуру(или функцию) значение Принтера каждой строки поочерёдно(и вычислять так же), либо передавать коллекцию Принтеров со всех строк?

Если брать данные из регистра сведений(получить последнее), то первую проводку для каждого принтера придётся заполнять вручную, но будет ли такой способ оптимальнее запроса ?

2)Наверное, для проводки нужно будет составить запрос, который Группировал бы Количество по полю Катридж(или самому написать алгоритм) - что правильнее(оптимальнее)?
Вопрос: Покажите как будет выглядит данный запрос(если он эффективнее)
+
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. starjevschik 13.12.18 22:31 Сейчас в теме
(1) оптимальнее всегда так, как может сделать исполнитель. Если он не может сделать, то никакая оптимальность не поможет.
Вот когда исполнитель сделает, пользователи будут работать и обнаружится неоптимальность, тогда можно будет заняться оптимизацией. Если нужно будет.
+
3. Macarevich 13.12.18 23:32 Сейчас в теме
(2) Имеется ввиду оптимальность как производительность. Если вы это имеете ввиду, то на сугубо моё мнение, Ваш подход изначально крайне неверный. Нужно стараться сделать так чтобы работало, а не абы как, а потом исправлять..
+
6. harvester_sorrow 24 14.12.18 10:12 Сейчас в теме
(2)Видимо автор не знает ято такое франч :-) где не важно КАК главное что бы работало и сделать на вчера!
+
7. starjevschik 14.12.18 13:02 Сейчас в теме
(6) на самом деле любому клиенту нужно, чтобы работало. И быстро и дешево. А как именно там внутри написано, никого не волнует. Не нужно это никому ВООБЩЕ СОВСЕМ. Увы всем апологетам правильного программирования.
Вот в этом топике мы имеем классический пример. Элементарная задача, любой программер за час наваяет и оно будет работать. Но автор, имея прекрасную (безусловно) цель сделать все академически правильно, красиво и "оптимально", третий день задачу клиенту не сдает и клиент все так же ждет. Если бы у автора была еще нормальная почасовая оплата, то их отношения с этим клиентом так бы и закончились на этой задаче совершенно бесславно. Но он, похоже, на окладе, а работодателю все равно, за что он платит.
1с - чисто прикладной вспомогательный инструмент, только так его и надо делать.
+
8. Macarevich 14.12.18 15:04 Сейчас в теме
(7) Это учебная задача. Я учусь. И хочу быть хорошо наученным ;)
+
5. harvester_sorrow 24 14.12.18 10:12 Сейчас в теме
(1)Видимо автор не знает ято такое франч :-) где не важно КАК главное что бы работало и сделать на вчера!
+
4. chernov.gigansk.ru 14.12.18 06:16 Сейчас в теме
1)
По условию
При выборе поля Принтер

Получается это не может быть
передавать коллекцию Принтеров со всех строк

--
Проблема в получении Владельца Принтера и реквизита Владельца

Какая проблема?
В упрощенном варианте будет работать: ТекущаяСтрокаТЧ.Принтер.Владелец.СрокЭксплуатации.
Правильнее через запрос
ВЫБРАТЬ СпрПринтеры.Владелец.СрокЭксплуатации КАК СрокЭксплуатации ИЗ Справочник.Принтеры КАК СпрПринтеры ГДЕ СпрПринтеры.Ссылка = &Принтер

На управляемых формах выполнять (и первый и второй вариант) &НаСервере.
СрокЭксплуатации+24*60*60 + ТекущаяДата()

Ошибка? Должно быть наверное "СрокЭксплуатации*24*60*60 + ТекущаяДата()"
2)

ВЫБРАТЬ
	ТЧ.ДатаСледОбслуживания КАК ДатаСледОбслуживания,
	ТЧ.Количество КАК Количество,
	ТЧ.Катридж КАК Катридж,
	ТЧ.Принтер КАК Принтер
ИЗ
	Документ.ТехОбслуживания.ТЧ КАК ТЧ
ГДЕ
	ТЧ.Ссылка = &СсылкаНаДокумент
ИТОГИ
	СУММА(Количество)
ПО
	Катридж
Показать

Обходить результат запроса ПоГруппировкам. В итогах будет количество по картриджах. В детальных записях данные Принтер-ДатаСледОбслуживания
Macarevich; +1
9. Macarevich 14.12.18 20:29 Сейчас в теме
(4) По поводу вычисления даты, да, ошибся.
По поводу 2 даже не проверял, т.к. уверен что работает.

Но вот по поводу 1 не получается.
ТекущаяСтрокаТЧ.Принтер.Владелец.СрокЭксплуатации

Это, как я понимаю из контекста ТекущаяСтрокаТЧ, нужно вводить в форме обработки на клиенте, но в таком случае через точку мы обращаемся к Владельцу, который на сервере, а обращение к серверу только на сервере ?

ВЫБРАТЬ СпрПринтеры.Владелец.СрокЭксплуатации КАК СрокЭксплуатации ИЗ Справочник.Принтеры КАК СпрПринтеры ГДЕ СпрПринтеры.Ссылка = &Принтер

Выдавало ошибку до этого как бы я не пытался сделать, но ошибка была в том, что возвращал РезультатЗапроса, а не ВыборкаДетальныеЗаписи (Во втором случае получилось, правильно ли это?)

Я был бы крайне благодарен, если бы подробнее рассказал как создавать ОбработкуЗаполнения(Клиент-общий модуль, клиент-сервер, клиент-сервер без контекста), что использовать - функцию или процедуру. Что передавать в параметре(Строка или Строка.Принтер)? И в случае функции, что лучше - два раза обращаться по отдельности к владельцу и к срокуэксплуатации, либо передавать оба значения сразу через структуру ?
+
10. VictorRGB2 13 20.12.18 09:29 Сейчас в теме
(9) Для начала я бы рекомендовал правильно определить задачу.
Например, в описании речь идет как о заполнении реквизитов строки, так и о заполнении всей ТЧ - это разные задачи и достигаются разными методами

1. задача заполнения реквизитов строки при выборе Принтер
вызывается на клиенте, на клиенте определяется ТекущаяСтрока и передается параметром на сервер, далее на сервере выполняется запрос по значению параметра ТекущаяСтрока.Принтер и результат запроса заполняет реквизиты ТекущаяСтрока

2. задача полного заполнения всей ТЧ
вызывается по кнопке на форме, на клиенте, передается на сервер без параметров, на сервере выполняется запрос по значению параметра массива Объект.ТЧ.ВыгрузитьКолонку("Принтер") и результат запроса обходом заполняет все реквизиты ТЧ построчно

Если хочется оптимально и красиво, пишется функция с запросом, куда передается параметром значение ТекущаяСтрока.Принтер из п.1 или Объект.ТЧ.ВыгрузитьКолонку("Принтер") из п.2 и возвращается результат в место вызова. При этом самое оптимальное, что бы результат запроса содержал все данные для заполнения реквизитов строки табличной части и имена переменных совпадали с именами колонок.
Тогда для заполнения реквизитов строки достаточно будет выполнить ЗаполнитьЗначенияСвойств(строкаПолучатель, строкаИсточник)

Однако я бы не решал задачу №2. Для пользователя и интерфейса достаточно задачи №1.
Про проводку также явно излишнее условие что-то сворачивать по количеству.
+
11. timeforlive 15 02.01.19 18:39 Сейчас в теме
С точки зрения практики - я бы выбрал наиболее быстрый способ выполнить задачу. Хотя если у вас есть время замерять производительность и вычислять какой способ на долю секунду будет работать быстрее, то вопрос имеет место быть.

Вижу, что ваш механизм будет постоянно претерпевать изменения и доработки, т.к. будут новые задачи и идеи, которые требуют реализацию. Поэтому дам не хороший совет - делайте запросом в цикле, если потребуется. Если вы передаете в запрос только данные без обращения к регистрам и вызову сервера.
Делайте код так, чтобы можно было легко вносить в него правки и доработки. И не делайте динамического запроса - текст запроса из кусков строк по условиям.
+
Внимание! Тема сдана в архив

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