Имя: Пароль:
1C
1С v8
Отбор записей в формы выбора справочника, связанного с регистром сведений
0 newer
 
20.06.17
14:40
Привет! 1С Предприятие 8.3 учебная версия, помогите разжевать пожалуйста.

Что имеется на данный момент:
1) Документ "ПредварительнаяЗапись" с реквизитами "ДатаЗаписи" (тип Дата), "ВремяЗаписи" (тип СправочникСсылка.ВременныеИнтервалы).
2) Регистр сведений "РегистрЗаписи", измерение "ИнтервалВремени" типа "СправочникСсылка.ВременныеИнтервалы", периодичность "В пределах дня", режим записи "Подчинение регистратору".
3) Справочник "ВременныеИнтервалы" без пользовательских реквизитов.
4) На форме документа "ПредварительнаяЗапись" я выбираю Дату, в поле "Время записи" щелкаю на стрелочку-показать все-открывается "Форма выбора" справочника "ВременныеИнтервалы", там я выбираю интервал:
http://imgdepo.com/id/10783129.jpg
Если попытаться сохранить документ, а уже был другой на это время-дату появляется ошибка "Запись с такими ключевыми полями уже существует! :РегистрЗаписи...", все правильно.

Вопрос: как при выборе времени скрыть уже занятые интервалы на выбранную дату? На одном форуме мне подсказали сделать сделать отбор по полю "ДатаЗаписи", написать запрос для регистра, в запросе указать "Не в списке". Полдня пытался это сделать, но бестолку. Не понимаю элементарных вещей: код писать для события "НачалоВыбора" поля "ВремяЗаписи" или для модуля формы справочника "ВременныеИнтервалы"? Или вообще для модуля регистра?
1 newer
 
21.06.17
22:09
Проблема решена, вышел такой костыль:

&НаКлиенте
Процедура ВремяЗаписиНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ЗанятыеДаты=ВыбратьЗанятыеДаты(Объект.ДатаЗаписи);  //вызываем функцию ВыбратьЗанятыеДаты, передаем ей дату (имя реквизита)
    ПараметрыФормы = Новый Структура;
    Настройки = Новый НастройкиКомпоновкиДанных;
    ЭлементОтбора = Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
    ЭлементОтбора.ЛевоеЗначение = Новый ПолеКомпоновкиДанных("Наименование"); //название поля (реквизита) в открываемом справочнике, по которому будет фильтрация
    ЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.НеВСписке; //тип фильтрации
    ЭлементОтбора.ПравоеЗначение = ЗанятыеДаты; //значение=массив ЗанятыеДаты
    ЭлементОтбора.Использование = Истина;
    ПараметрыФормы.Вставить("ФиксированныеНастройки", Настройки);
    ОткрытьФорму("Справочник.ВременныеИнтервалы.ФормаВыбора", ПараметрыФормы, Элемент);
КонецПроцедуры

&НаСервере
Функция ВыбратьЗанятыеДаты(ВыбраннаяДатаЗаписи)
    Запрос = Новый Запрос;
    //выбираем из регистра сведений интервалы времени (лежат в наименованиях) для выбранной даты
    Запрос.Текст = "ВЫБРАТЬ
     |    РегистрСведений1СрезПоследних.Период,
     |    РегистрСведений1СрезПоследних.ИнтервалВремени.Наименование КАК Наименование
     |ИЗ
     |    РегистрСведений.РегистрСведений1.СрезПоследних КАК РегистрСведений1СрезПоследних
     |ГДЕ
     |    РегистрСведений1СрезПоследних.Период = &Период";
    
     Запрос.УстановитьПараметр("Период",ВыбраннаяДатаЗаписи); // в запросе &Период заменится на переданный функции параметр ВыбраннаяДатаЗаписи  
     Список = Новый Массив;
     Результат = Запрос.Выполнить();
     Итог = Результат.Выбрать();
     //заполняем массив элементами запроса
     Пока Итог.Следующий() Цикл
         Список.Добавить(Итог.Наименование);  
     КонецЦикла;
     Возврат  Список;  //функция вернет массив
КонецФункции

Историю и автозаполнение поля пришлось убрать в свойствах