Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
06 дек 2023, 20:09

Запуталась с Элементами и Объектами

Автор Николямба, 16 дек 2021, 19:25

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

Николямба

Суть такова:
Есть справочник (СИЗ), в котором иерархический список(Родитель), в котором есть список номенклатуры(реквизита наименования нет)
Есть Документ, в котором есть строка, где я выбираю группу справочника(УсловияОкружающейСреды)
Также в документе есть таблица(СИЗ), которая должна выводить все значения(Наименование и количество) выбранной группы по кнопке
Наработки кода прилагаю, возможно, я где-то попутала значения и все пошло не так

&НаКлиенте
Процедура Команда3(Команда)
ЗаполнениеТ3();

КонецПроцедуры
&НаСервере
Процедура ЗаполнениеТ3()
Для Каждого Элемент из Объект.Ссылка.СИЗ.Родитель Цикл

    ПоискЗначе(Элемент.УсловияОкружающейСреды, "СИЗ");   
       КонецЦикла;
    КонецПроцедуры 
   

    &НаСервере
Процедура ПоискЗначе(Родитель, СправочникПоиска)

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

             Запись = Ложь;
             Прервать;
          КонецЕсли;
      КонецЦикла;
       Если Запись = Истина тогда
          НоваяСтрока = Объект.СИЗ.Добавить();
          НоваяСтрока.Наименование = Выборка.Ссылка;
          НоваяСтрока.Количество = 1;
       КонецЕсли;      
   КонецЦикла;   
   Объект.СИЗ.Сортировать("Наименование");
КонецЕсли;
           КонецПроцедуры

alexandr_ll

Николямба, https://helpme1c.ru/spravochniki-v-yazyke-1s-8-v-primerax

Справочники в языке 1С 8.3, 8.2 (в примерах)

&НаСервере
Процедура СозданиеИИзменениеЭлементовИГруппСправочникаНаСервере()

/// Как создать новый элемент справочника в 1с 8.3, 8.2

// создадим новый элемент справочника Города
// с именем Владивосток
Владивосток = Справочники.Города.СоздатьЭлемент();
Владивосток.Наименование = "Владивосток";
Владивосток.Записать();

/// Как создать новую группу справочника в 1с 8.3, 8.2

// создадим новую группу справочника Города
ГородаУМоря = Справочники.Города.СоздатьГруппу();
ГородаУМоря.Наименование = "Города у моря";
ГородаУМоря.Записать();

/// Как перенести элемент справочника в другую группу в 1с 8.3, 8.2

// перенесём созданный Владивосток в группу "Города у моря"
Владивосток.Родитель = ГородаУМоря.Ссылка;
Владивосток.Записать();

/// Как внести изменения в элемент справочника по ссылке
/// в 1с 8.3, 8.2

// найдём город Калькутта
КалькуттаСсылка = Справочники.Города.НайтиПоНаименованию("Калькутта");
Если Не КалькуттаСсылка.Пустая() Тогда
// изменим и запишем численность жителей в городе
Калькутта = КалькуттаСсылка.ПолучитьОбъект();
Калькутта.Численность = 1000000;
Калькутта.Записать();
КонецЕсли;

/// Как получить и проверить пустую ссылку типа справочник в 1с 8.3, 8.2

ПустаяСсылка = Справочники.Города.ПустаяСсылка();
Если ПустаяСсылка.Пустая() Тогда
Сообщить("Ссылка действительно пустая.");
КонецЕсли;

/// Как узнать принадлежность элемента справочника группе
/// с учетом уровней иерархии в 1с 8.3, 8.2

ПермьСсылка = Справочники.Города.НайтиПоНаименованию("Пермь");
РоссияСсылка = Справочники.Города.НайтиПоНаименованию("Россия");

// проверим принадлежит ли город Пермь группе Россия

Если ПермьСсылка.ПринадлежитЭлементу(РоссияСсылка) Тогда
Сообщить("Элемент Пермь находится в группе Россия.");
КонецЕсли;

/// Как скопировать существующий элемент справочника в 1с 8.3, 8.2

// скопируем элемент Пермь

КопияПерми = ПермьСсылка.Скопировать();
КопияПерми.Наименование = КопияПерми.Наименование + " КОПИЯ";
КопияПерми.УстановитьНовыйКод();
КопияПерми.Записать();

/// Как выяснить уровень вложенности элемента справочника
/// в 1с 8.3, 8.2

Сообщить(КопияПерми.Уровень()); // 1

/// Как заблокировать элемент справочника перед изменениями
/// в 1с 8.3, 8.2

// выполним блокировку элемента справочника
// от изменения другими режимами или пользователями

Пермь = ПермьСсылка.ПолучитьОбъект();
Если Не Пермь.Заблокирован() Тогда
Пермь.Заблокировать();
// тут идёт какой-то долгий алгоритм
// в результате которого мы меняем
// заблокированный элемент
Пермь.Численность = 5000;
Пермь.Записать();
// и только потом освобождаем его
// для других режимов и пользователей
Пермь.Разблокировать();
КонецЕсли;

/// Как заполнить новый элемент справочника на основании
/// в 1с 8.3, 8.2

// в модуле справочника Города я определил процедуру
// ОбработкаЗаполнения, которая обрабатывает ситуации
// когда мы заполняем один элемент на основании
// данных другого (см. в базе для скачивания)

Хабаровск = Справочники.Города.СоздатьЭлемент();
Хабаровск.Заполнить(
Справочники.Города.НайтиПоНаименованию("Рио-де-Жанейро")
);
Хабаровск.Наименование = "Хабаровск";
Хабаровск.Записать();

/// Как пометить на удаление элемент справочника в 1с 8.3, 8.2

// пометим на удаление только что созданный Хабаровск
Хабаровск.УстановитьПометкуУдаления(
Истина, // пометка удаления
Ложь // включая подчиненные (если речь о группе справочника)
);
// метод Записать вызывать не нужно

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

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

/// Как открыть форму существующего элемента справочника
/// по ссылке в 1с 8.3, 8.2

&НаКлиенте
Процедура КакОткрытьФормуСуществующегоЭлементаСправочника(Команда)

СсылкаНаЭлемент = ПолучитьКлиентаПоИмени("Андрей");

ПараметрыФормы = Новый Структура("Ключ", СсылкаНаЭлемент);

ОткрытьФорму(
"Справочник.Клиенты.ФормаОбъекта", // имя формы
ПараметрыФормы // параметры для формы
);

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

/// Как открыть форму существующей группы справочника
/// по ссылке в 1с 8.3, 8.2

&НаКлиенте
Процедура КакОткрытьФормуСуществующейГруппыСправочника(Команда)

СсылкаНаГруппу = ПолучитьКлиентаПоИмени("Vip");

ПараметрыФормы = Новый Структура("Ключ", СсылкаНаГруппу);

ОткрытьФорму(
"Справочник.Клиенты.ФормаГруппы", // имя формы
ПараметрыФормы // параметры для формы
);

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

/// Как открыть форму выбора элемента справочника и
/// отследить её закрытие в 1с 8.3, 8.2

&НаКлиенте
Процедура КакОткрытьФормуВыбораЭлементаСправочника(Команда)

ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораЭлемента",
ЭтотОбъект);

ОткрытьФорму(
"Справочник.Клиенты.ФормаВыбора",,,,,,ОповещениеОЗакрытии
);

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

&НаКлиенте
Процедура ПослеВыбораЭлемента(Результат, Параметры) Экспорт

Если Результат <> Неопределено Тогда
Сообщить("Был выбран элемент " + Результат);
КонецЕсли;

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

/// Как открыть форму выбора группы справочника и
/// отследить её закрытие в 1с 8.3, 8.2

&НаКлиенте
Процедура КакОткрытьФормуВыбораГруппыСправочника(Команда)

ОповещениеОЗакрытии = Новый ОписаниеОповещения("ПослеВыбораГруппы",
ЭтотОбъект);

ОткрытьФорму(
"Справочник.Клиенты.ФормаВыбораГруппы",,,,,,ОповещениеОЗакрытии
);

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

&НаКлиенте
Процедура ПослеВыбораГруппы(Результат, Параметры) Экспорт

Если Результат <> Неопределено Тогда
Сообщить("Была выбрана группа " + Результат);
КонецЕсли;

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

/// Как открыть форму списка справочника и
/// установить отбор по реквизиту в 1с 8.3, 8.2

&НаКлиенте
Процедура КакОткрытьФормаСпискаСправочникаСОтбором(Команда)

// откроем список клиентов, оставив
// только мужчин

ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Пол", ПолучитьПеречислениеМужской());

ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);

ОткрытьФорму(
"Справочник.Клиенты.ФормаСписка",
ПараметрыФормы
);

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

&НаСервереБезКонтекста
Функция ПолучитьПеречислениеМужской()
Возврат Перечисления.Пол.Мужской;
КонецФункции

/// Как открыть форму списка справочника с нужным отображением
/// в 1с 8.3, 8.2

&НаКлиенте
Процедура КакОткрытьФормуСпискаСправочникаСНужнымОтображением(Команда)

// откроем список клиентов с отображением "Список"

ФормаСписка = ПолучитьФорму("Справочник.Клиенты.ФормаСписка");
ФормаСписка.Открыть();
ФормаСписка.Элементы.Список.Отображение = ОтображениеТаблицы.Список;

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

/// Как открыть форму только что созданного, но ещё
/// не записанного элемента справочника в 1с 8.3, 8.2

&НаКлиенте
Процедура КакОткрытьФормуНовогоНеЗаписанногоСправочника(Команда)

// получаем форму нового справочника
ФормаНовогоСправочника = ПолучитьФорму(
"Справочник.Еда.ФормаОбъекта",,, Истина);

// делаем копию её данных (так как напрямую их менять
// нельзя)
КопияДанныхФормы = ФормаНовогоСправочника.Объект;

// заполняем эти данные на сервере
ЗаполнитьДанныеФормыНаСервере(КопияДанныхФормы);

// копируем заполненные данные в исходную форму
КопироватьДанныеФормы(КопияДанныхФормы,
ФормаНовогоСправочника.Объект);

// показываем форму нового заполненного
// элемента справочника пользователю
ФормаНовогоСправочника.Открыть();

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

&НаСервере
Процедура ЗаполнитьДанныеФормыНаСервере(ДанныеФормы)

// преобразуем данные формы в документ
Еда = ДанныеФормыВЗначение(ДанныеФормы,
Тип("СправочникОбъект.Еда"));

Еда.Наименование = "Груша";
Еда.Калорийность = 500;

// преобразуем документа обратно в данные формы
ЗначениеВДанныеФормы(Еда, ДанныеФормы);

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

/// Скачать и выполнить эти примеры на компьютере

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

Рейтинг@Mail.ru

Поиск