Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
22 ноя 2024, 05:17

опять вопрос про "много" реквизитов в справочнике (или документе)

Автор andron81_81, 01 дек 2017, 11:20

0 Пользователей и 1 гость просматривают эту тему.

andron81_81

Цитата: ilyay от 05 дек 2017, 12:21
Никто не заставляет вас использовать характеристики. Проектное решение принимать вам.

да , но я бы прислушался к вашему мнению .

Цитата: ilyay от 05 дек 2017, 12:21
Чтобы записать что-то в табличную часть, нужно получить объект, внести изменения в табличную часть и записать объект. Чтобы записать в регистр сведений, получать объект не нужно. Это может быть как плюсом, так и минусом. Просто имейте ввиду.
учту.
Цитата: ilyay от 05 дек 2017, 12:21
Вопрос блокировок СУБД для вас сейчас вообще не актуален, я про него не буду писать.

почему не актуален ? планируется многопользовательское юзание. опыт разработки имеется на других системах.

Цитата: ilyay от 05 дек 2017, 12:21
Если вы даете пользователю редактировать табличную часть он может удалить/добавить строки, что возможно, необходимо контролировать.

не буду давать . кнопки "+" "-" убираю. только редактирование поля значения.

Цитата: ilyay от 05 дек 2017, 12:21
Варианты можно и в справочник добавлять или запрещать добавлять.

в характеристике всё то хорошо, но не позволяет редактировать выбранное значение из справочника. поэтому придется делать велосипед.

склоняюсь к следующему решению :
0. справочник "ВсеРеквизиты" . тут храню свойства реквизита: имя , тип значения, галочка отображаем в таб. части (да/нет), категория (только ввод, выбор из списка, выбор из списка с дополнением)
1. регистр сведений собираю значения реквизитов
2. таб. часть (2 колонки , 3-я колонкой кнопка может быть может не быть) . ввёл значение в регистре сведения появляется строка со значением, убрал строчки нет. Если есть кнопка в строке таб. части, то можем нажать и выбрать, а при выборе выбранное значение появляется в строчке , строку можем подредактировать.
3. справочник значений. тут помойка значений . в качестве ключа имя реквизита. 
при открытии документа в таб. часть выводится по запросу из справочника "ВсеРеквизиты" лефт джоинм с регистром сведений.

как-то так

ilyay

Цитата: andron81_81 от 05 дек 2017, 13:15

в характеристике всё то хорошо, но не позволяет редактировать выбранное значение из справочника.


Логично. Это значение уже где-то может использоваться. Нужно создать новое, если не подходят существующие. 1С уже давно сделала, что под полем выпадает кнопка создания нового элемента.

andron81_81

Цитата: ilyay от 05 дек 2017, 13:54
Логично. Это значение уже где-то может использоваться. Нужно создать новое, если не подходят существующие. 1С уже давно сделала, что под полем выпадает кнопка создания нового элемента.
да это понятно.
Но лишние действия для пользователя. плюс к этому нужно отслеживать как бы не ввести существующий элемент с разницей в пробелы или в знаки препинания. в общем ещё и такие соображения. Однако это логичнее для хранения данных . одно дело регистр будет хранить ссылки , а другое текстовые значения. Вы думаете , если делать как я планирую база сильно разрастется ?

ilyay

Смотря какие строковые значения.
Если строки длиннее, чем количество байт для хранения ссылки, то ссылки будут компактнее.
Вторая проблема - разные символы: строчные/заглавные, английские/русские одинаковые по начертанию. Использование справочника сильно упрощает жизнь в этом смысле.

Тут надо посмотреть на то, сколько разных значений будет. Если каждый вводит своё, то конечно, надо хранить строки.

andron81_81

Цитата: ilyay от 05 дек 2017, 14:06
Смотря какие строковые значения.
Если строки длиннее, чем количество байт для хранения ссылки, то ссылки будут компактнее.
Вторая проблема - разные символы: строчные/заглавные, английские/русские одинаковые по начертанию. Использование справочника сильно упрощает жизнь в этом смысле.

Тут надо посмотреть на то, сколько разных значений будет. Если каждый вводит своё, то конечно, надо хранить строки.

в общем надо наверно проанализоровать из старой программы сделать distinct - запрос по значениям которые в них были.
Если разнообразие невелико , то делать ссылки на значение в справочнике, в противном случае это будет строка с дополнением .
В общем спасибо ! :btbzdb:

AIFrame

Если привязываться к объекту, то:
Убираем все 500 реквизитов, оставляем базовые, типа комментария.
Создаем ТЧ для этого документа - Параметры.
Реквизиты ТЧ:
- Параметр ЗначенияПараметровДокумента.Ссылка
- Значение Составной(Число, Строка, Дата, что-то еще), а еще лучше - Число, Строка, Дата, Булево и Любая ссылка
Создаем Сервисный (для нас) справочник ЗначенияПараметровДокумента, куда пишем реквизиты:
- Наименование - имя реквизита
- Применяется - Новое перечисление (ККлиенту, КМенеджеру и т.д.) или вместо этого Булева типа ПрименяетсяККлиенту, ПрименяетсяКМенеджеру, если будут кросс-параметры. С точки зрения гибкости - лучше булевы, т.к. добавлене значений в перечисление = выгонять всех из базы.
- ТипЗначения - Строка. Можно строкой вписывать типа "Число", или "Строка" "ДокументСсылка.ЗаказПоставщику" и т.д. Обработчик на форме будет выбирать нужный тип данных при выборе строки.

Ну и остальное - обработчики объектов и форм.
Для клиента при заполнении заказа в ТЧ назначается отбор по ПрименяетсяККлиенту
Для менеджера - ПрименяетсяКМенеджеру. Т.е. видят они только свои.
При создании документа ТЧ наполняется всем перечнем один раз. После завершения работы с заказом - по статусу или по проведению - удаляем все незаполненные строки из ТЧ, чтобы меньше хранить.

Из плюсов:
- Можно динамически добавлять новые параметры к заказу и назначать их применение.
- Можно делать запросы прямо по Документ.Параметры, не соединяя влево с регистром сведений.
- Удаление записи в регистре "внезапно" удалит значение для документа. Тут так не получится, документ потребуется перезаписать и это отразится в Журнале регистрации. Но можно и изменения в регистре отразить в ЖР, прописать только надо.

Из минусов:
- Первоначальная версия документа будет тяжелой. Но это можно подшаманить, заполняя ТЧ поэтапно, просто больше прописать придется.
- Можно сделать по другому
- Что-то еще, не могу придумать.

andron81_81

Цитата: AIFrame от 05 дек 2017, 14:55
- ТипЗначения - Строка. Можно строкой вписывать типа "Число", или "Строка" "ДокументСсылка.ЗаказПоставщику" и т.д. Обработчик на форме будет выбирать нужный тип данных при выборе строки.

я верно понял , что Вы предлагаете хранить значение в строке . А туда писать значения вышеуказанных типов.
Если верно, то в этом то и вопрос . Если я буду хранить абсолютно всё в строках - круто и удобно , но с точки зрения хранения данных каково .
Товарищ который ранее писал небезосновательно предлагал пользоваться стандартным механизмом выбора значений, дополняя их в случае чего в справочнике. в этом случае у нас будет в значении только ссылка. это хорошо сохранит дисковое пространство. В этом случае уже из тех соображений , что мы в 1000 разных заказах, указав в реквизите "формат" одно и то же значение, выбрав его из справочника выиграем нежели в заказах будет храниться строками 100x200, 100x200...

p.s. И кстати где я буду хранить реквизиты в тч заказа или в регистре сведения не принципиально. лучше наверно всё-таки в регистре сведений .

AIFrame

Совершенно неверно.
Короче, рисую.
Видишь то, что зеленым выделено?
Значение может быть строкой, числом, датой, булевом ИЛИ Любой ссылкой на любой объект в базе.
В ПараметрыЗаказа.ТипЗначения ты прописываешь строкой. Например:
Параметр = "ФИО"
ТипЗначения = "Строка"

Параметр = "Склад отгрузки"
ТипЗначения = "СправочникСсылка.Склады"

На форме документа где выводится ТЧ ты программно присваиваешь для каждой строки в колонке значения тип значения, который соответствует в этой же строке значению Параметр.ТипЗначения.
Что-то типа:
    ОписаниеТипов = Новый ОписаниеТипов(СтрокаПараметров.Параметр.ТипЗначения);
    СтрокаПараметров.Значение = ОписаниеТипов.ПривестиЗначение(СтрокаПараметров.Значение);

Т.е. ты в ТипЗначения по сути пишешь имя метаданных для ОписаниеТипов.

andron81_81

Цитата: AIFrame от 05 дек 2017, 16:58
Совершенно неверно.
Короче, рисую.
Видишь то, что зеленым выделено?
Значение может быть строкой, числом, датой, булевом ИЛИ Любой ссылкой на любой объект в базе.
В ПараметрыЗаказа.ТипЗначения ты прописываешь строкой. Например:
Параметр = "ФИО"
ТипЗначения = "Строка"

Параметр = "Склад отгрузки"
ТипЗначения = "СправочникСсылка.Склады"

На форме документа где выводится ТЧ ты программно присваиваешь для каждой строки в колонке значения тип значения, который соответствует в этой же строке значению Параметр.ТипЗначения.
Что-то типа:
    ОписаниеТипов = Новый ОписаниеТипов(СтрокаПараметров.Параметр.ТипЗначения);
    СтрокаПараметров.Значение = ОписаниеТипов.ПривестиЗначение(СтрокаПараметров.Значение);

Т.е. ты в ТипЗначения по сути пишешь имя метаданных для ОписаниеТипов.

неплохо . попробую сейчас. но мне ещё необходим тип "строка с вариантами". это когда вы можете просто ввести строку, а можете правее нажать на кнопку "выбрать вариант" вам в строку пропечатается вариант и вы можете подредактировать его.
Добавлено: 05 дек 2017, 19:17


Цитата: andron81_81 от 05 дек 2017, 18:49
Цитата: AIFrame от 05 дек 2017, 16:58
Совершенно неверно.
Короче, рисую.
Видишь то, что зеленым выделено?
Значение может быть строкой, числом, датой, булевом ИЛИ Любой ссылкой на любой объект в базе.
В ПараметрыЗаказа.ТипЗначения ты прописываешь строкой. Например:
Параметр = "ФИО"
ТипЗначения = "Строка"

Параметр = "Склад отгрузки"
ТипЗначения = "СправочникСсылка.Склады"

На форме документа где выводится ТЧ ты программно присваиваешь для каждой строки в колонке значения тип значения, который соответствует в этой же строке значению Параметр.ТипЗначения.
Что-то типа:
    ОписаниеТипов = Новый ОписаниеТипов(СтрокаПараметров.Параметр.ТипЗначения);
    СтрокаПараметров.Значение = ОписаниеТипов.ПривестиЗначение(СтрокаПараметров.Значение);

Т.е. ты в ТипЗначения по сути пишешь имя метаданных для ОписаниеТипов.

неплохо . попробую сейчас. но мне ещё необходим тип "строка с вариантами". это когда вы можете просто ввести строку, а можете правее нажать на кнопку "выбрать вариант" вам в строку пропечатается вариант и вы можете подредактировать его.
но как это сделать мысли тоже есть. подсказали выше
Добавлено: 06 дек 2017, 10:36


Цитата: AIFrame от 05 дек 2017, 16:58
Совершенно неверно.
Короче, рисую.
Видишь то, что зеленым выделено?
Значение может быть строкой, числом, датой, булевом ИЛИ Любой ссылкой на любой объект в базе.
В ПараметрыЗаказа.ТипЗначения ты прописываешь строкой. Например:
Параметр = "ФИО"
ТипЗначения = "Строка"

Параметр = "Склад отгрузки"
ТипЗначения = "СправочникСсылка.Склады"

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


Скажите , а ваш метод подразумевает , что пользователь должен выбрать тип данных при вводе поле значение ?
я делал как у Вас у меня просит именно выбрать тип. Я наверно что - то сделал не так .

Сделал 3 справочника.
ТипРеквизита
- Наименование (стандартное)
- ТипРеквизита (строка)

ТипПереплета
- Наименование (стандартное)

ФорматИздания
- Наименование (стандартное)

Сделал документ
ПЗаказ
в нем Табчасть ПараметрыЗаказа с полями
-  Параметры (Справочники.ТипРеквизита)
-  Значение  (составной тип : строка, булева, дата, справочники)

код таков :



&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
       Объект.ПараметрыЗаказа.Очистить();
Реквизит = Справочники.СвойстваРеквизитов.Выбрать();
Пока Реквизит.Следующий() Цикл
СтрокаПараметров = Объект.ПараметрыЗаказа.Добавить();
СтрокаПараметров.Параметр = Реквизит.Ссылка;
ОписаниеТипов = Новый ОписаниеТипов(СтрокаПараметров.Параметр.ТипРеквизита);
СтрокаПараметров.Значение =
ОписаниеТипов.ПривестиЗначение(СтрокаПараметров.Значение);
   //Если Реквизит.ТипРеквизита <> "Строка" Тогда
//КонецЕсли;
КонецЦикла;
КонецПроцедуры

Выбор типа из списка это не хорошо. Пользователи не в адеквате есть.
С менеджерами накручивать не стал. Это другая задача.
конфу прикрепляю

AIFrame

// -------------------- События Формы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Объект.ПараметрыЗаказа.Очистить();
ЗаполнитьТаблицуПараметров();
КонецПроцедуры

// -------------------- События ТЧ Параметры
&НаКлиенте
Процедура ПараметрыЗаказаЗначениеНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
ТекущиеДанные = Элементы.ПараметрыЗаказа.ТекущиеДанные;
УстановитьСоответствиеТипов(ТекущиеДанные);
Элемент.ВыбиратьТип = Ложь;
КонецПроцедуры

// -------------------- Универсальные

&НаСервере
Процедура ЗаполнитьТаблицуПараметров()
Реквизит = Справочники.СвойстваРеквизитов.Выбрать();
Пока Реквизит.Следующий() Цикл
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Параметр", Реквизит.Ссылка);
НайденныеСтроки = Объект.ПараметрыЗаказа.НайтиСтроки(ПараметрыОтбора);
Если НайденныеСтроки.Количество() = 0 Тогда
СтрокаПараметров = Объект.ПараметрыЗаказа.Добавить();
СтрокаПараметров.Параметр = Реквизит.Ссылка;
Иначе
СтрокаПараметров = НайденныеСтроки[0];
КонецЕсли;

Если Реквизит.ТипРеквизита <> "Строка" Тогда

КонецЕсли;
КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура УстановитьСоответствиеТипов(ТекущиеДанные)
ТипРеквизита = ПолучитьТипРеквизита(ТекущиеДанные.Параметр);
ОписаниеТипов = Новый ОписаниеТипов(ТипРеквизита);
ТекущиеДанные.Значение = ОписаниеТипов.ПривестиЗначение(ТекущиеДанные.Значение);
КонецПроцедуры

&НаСервере
Функция ПолучитьТипРеквизита(Ссылка)
Возврат Ссылка.ТипРеквизита;
КонецФункции

Похожие темы (5)

Рейтинг@Mail.ru

Поиск