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

Задача на учебной версии 1С

Автор vosmerka, 12 июн 2022, 23:49

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

vosmerka

В задаче нужно чтобы поле "Контактные лица" автоматически заполнялось при изменении поля "Покупатель" имеющий тип данных "Объект.Контрагенты", затем с помощью механизма запросов нужно обеспечить выбор в том же поле из контактных лиц конкретного контрагента. Как это сделать?

alexandr_ll

vosmerka, "Контактные лица" может быть справочником, подчиненным справочнику "Контрагенты", либо регистром сведений. В первом случае запрос не нужен, просто устанавливаем тип значения Справочник. Ссылка. Для регистра сведений https://helpme1s.ru/registry-svedenij-v-yazyke-1s-8-v-primerax

Регистры сведений в языке 1С 8.3, 8.2 (в примерах)

Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.

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

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

// Прочитаем все записи регистра сведений "ЦенаНаЕдуДляКлиентов"
// для организации ООО "Ромашка", упорядоченные по дате.

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

Запрос.УстановитьПараметр(
"ВыбОрганизация",
Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""")
);

РезультатЗапроса = Запрос.Выполнить();

Записи = РезультатЗапроса.Выбрать();

Пока Записи.Следующий() Цикл

Сообщить(
"[" + Записи.Период + "] " +
Записи.Контрагент + " " +
Записи.Номенклатура + " " +
Записи.Цена + " руб."
);

КонецЦикла;

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

/// Как получить наиболее поздние записи (срез последних)
/// регистра сведений на указанную дату (включительно)
/// в 1с 8.3, 8.2

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

// За возможности выборки наиболее поздних записей регистра
// сведений (среза последних) в разрезе заданной аналитики
// отвечает виртуальная таблица СрезПоследних.
// У неё есть следующие параметры:
// 1. Период (включительно)
// 2. Условие (например, Организация = &ВыбОрганизация)

// Получим цены на бананы для каждого контрагента
// на конец 1 квартала 2014 года (включительно)
// по организации ООО "Ромашка".

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦенаНаЕдуДляКлиентовСрезПоследних.Период,
| ЦенаНаЕдуДляКлиентовСрезПоследних.Активность,
| ЦенаНаЕдуДляКлиентовСрезПоследних.Номенклатура,
| ЦенаНаЕдуДляКлиентовСрезПоследних.Контрагент,
| ЦенаНаЕдуДляКлиентовСрезПоследних.Организация,
| ЦенаНаЕдуДляКлиентовСрезПоследних.Цена
|ИЗ
| РегистрСведений.ЦенаНаЕдуДляКлиентов.СрезПоследних(
| ДАТАВРЕМЯ(2014, 03, 31, 23, 59, 59),
| Активность = Истина И
| Организация = &ВыбОрганизация И
| Номенклатура = &ВыбНоменклатура
| ) КАК ЦенаНаЕдуДляКлиентовСрезПоследних
|УПОРЯДОЧИТЬ ПО
| ЦенаНаЕдуДляКлиентовСрезПоследних.Контрагент";

Запрос.УстановитьПараметр("ВыбОрганизация",
Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""")
);
Запрос.УстановитьПараметр("ВыбНоменклатура",
Справочники.Номенклатура.НайтиПоНаименованию("Банан")
);

РезультатЗапроса = Запрос.Выполнить();

Записи = РезультатЗапроса.Выбрать();

Пока Записи.Следующий() Цикл
Сообщить(
"[" + Записи.Контрагент + ", " + Записи.Период + "] " +
Записи.Номенклатура + " " +
Записи.Цена + " руб."
);
КонецЦикла;

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

/// Как получить наиболее ранние записи (срез первых)
/// регистра сведений на указанную дату (включительно)
/// в 1с 8.3, 8.2

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

// За возможности выборки наиболее ранних записей регистра
// сведений (среза первых) в разрезе заданной аналитики
// отвечает виртуальная таблица СрезПервых.
// У неё есть следующие параметры:
// 1. Период (включительно)
// 2. Условие (например, Организация = &ВыбОрганизация)

// ! Нужно внимательно вдуматься. СрезПервых получает по каждой
// комбинации измерений наиболее раннюю запись, но НЕ БОЛЕЕ
// РАННЮЮ, чем указанная дата.

// Получим самые первые цены, которые были установлены на бананы
// для каждого контрагента в 2014 году (включительно)
// по организации ООО "Ромашка".

Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ЦенаНаЕдуДляКлиентовСрезПервых.Период,
| ЦенаНаЕдуДляКлиентовСрезПервых.Активность,
| ЦенаНаЕдуДляКлиентовСрезПервых.Номенклатура,
| ЦенаНаЕдуДляКлиентовСрезПервых.Контрагент,
| ЦенаНаЕдуДляКлиентовСрезПервых.Организация,
| ЦенаНаЕдуДляКлиентовСрезПервых.Цена
|ИЗ
| РегистрСведений.ЦенаНаЕдуДляКлиентов.СрезПервых(
| ДАТАВРЕМЯ(2014, 01, 01, 00, 00, 00),
| Активность = Истина И
| Организация = &ВыбОрганизация И
| Номенклатура = &ВыбНоменклатура
| ) КАК ЦенаНаЕдуДляКлиентовСрезПервых
|УПОРЯДОЧИТЬ ПО
| ЦенаНаЕдуДляКлиентовСрезПервых.Контрагент";

Запрос.УстановитьПараметр("ВыбОрганизация",
Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""")
);
Запрос.УстановитьПараметр("ВыбНоменклатура",
Справочники.Номенклатура.НайтиПоНаименованию("Банан")
);

РезультатЗапроса = Запрос.Выполнить();

Записи = РезультатЗапроса.Выбрать();

Пока Записи.Следующий() Цикл
Сообщить(
"[" + Записи.Контрагент + ", " + Записи.Период + "] " +
Записи.Номенклатура + " " +
Записи.Цена + " руб."
);
КонецЦикла;

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

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

&НаСервере
Процедура КакНайтиИИзменитьЗаписиДокументаНаСервере()

// Предположим, у нас есть ссылка на проведенный документ
// "Установка цен на еду" № ВМБП-000001

УстановкаЦенСсылка =
Документы.УстановкаЦенНаЕдуДляКлиентов.НайтиПоНомеру(
"ВМБП-000001", '20141231'
);

// Мы знаем, что этот документ делает записи в регистр
// сведений "ЦенаНаЕдуДляКлиентов":
// [Организация, Контрагент, Номенклатура] [Цена]

// Наша задача: найти эти записи и изменит их (например, удвоим
// цену) и записать вместо старых.

// Используем объектную технику получения записей,
// ведь мы будем их изменять.

УстановкаЦен = УстановкаЦенСсылка.ПолучитьОбъект();

// Получим набор записей этого документа в регистр
// "ЦенаНаЕдуДляКлиентов"

НаборЗаписей = УстановкаЦен.Движения.ЦенаНаЕдуДляКлиентов;

// Прочитаем записи из базы данных.

НаборЗаписей.Прочитать();

Для Каждого Запись Из НаборЗаписей Цикл

// Выведем старые значения.
Сообщить(
"[" + Запись.Организация + ", " +
Запись.Контрагент + ", " +
Запись.Номенклатура + "] " +
"[" + Запись.Цена + "]"
);

Запись.Цена = Запись.Цена * 2;

КонецЦикла;

// Добавим новую запись.

НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись.Период = ТекущаяДата();
НоваяЗапись.Организация =
Справочники.Организации.НайтиПоНаименованию("ООО ""Ромашка""");
НоваяЗапись.Контрагент =
Справочники.Контрагенты.НайтиПоНаименованию("Петров Ю.В.");
НоваяЗапись.Номенклатура =
Справочники.Номенклатура.НайтиПоНаименованию("Банан");
НоваяЗапись.Цена = 500;

// Разом запишем набор записей.
НаборЗаписей.Записать(
Истина // Удалим старые записи и запишем вместо них новые.
);

// Теперь записи регистра "ЦенаНаЕдуДляКлиентов" для документа
// № ВМБП000001, отличаются от тех, что были записаны
// документом при проведении. Чтобы вернуть их к начальному виду
// нужно заново провести документ.

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

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

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

// Этот прием используется, если не требуется изменять
// найденные записи.

// Предположим, у нас есть ссылка на проведенный документ
// "Установка цен на еду" № ВМБП-000001

УстановкаЦенСсылка =
Документы.УстановкаЦенНаЕдуДляКлиентов.НайтиПоНомеру(
"ВМБП-000001", '20141231'
);

// Мы знаем, что этот документ делает записи в регистр
// сведений "ЦенаНаЕдуДляКлиентов".
// Прочитаем эти записи запросом.

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

Запрос.УстановитьПараметр(
"ВыбРегистратор",
УстановкаЦенСсылка
);

РезультатЗапроса = Запрос.Выполнить();

Записи = РезультатЗапроса.Выбрать();

Пока Записи.Следующий() Цикл
Сообщить(
"[" + Записи.Организация + ", " +
Записи.Контрагент + ", " +
Записи.Номенклатура + "] " +
"[" + Записи.Цена + "] <" +
Записи.Регистратор + ">"
);
КонецЦикла;

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

/// Как создать записи в регистр сведений без привязки к
/// документу в 1с 8.3, 8.2

&НаСервере
Процедура КакСоздатьЗаписиБезПривязкиКДокументуНаСервере()

// Создавать записи в регистре сведений без привязки
// к документу можно только для регистров, у которых
// выбран режим записи "Независимый". В нашей конфигурации
// таким регистром является "КурсВалют".
// Если бы мы захотели проделать такую же штуку для
// регистра "ЦенаНаЕдуДляКлиентов", то нам бы пришлось
// воспользоваться документом "ОперацияБух" или им подобным
// для ручных операций (см. аналогичный пример в регистрах
// накопления).

// Пример №1.

// Для единичных записей удобно пользоваться менеджером
// записей.

НоваяЗапись = РегистрыСведений.КурсВалют.СоздатьМенеджерЗаписи();
НоваяЗапись.Период = '20140101';
НоваяЗапись.Валюта = Справочники.Валюты.НайтиПоНаименованию("Доллар");
НоваяЗапись.Курс = 30;
НоваяЗапись.Записать(
Истина // замещать, если уже есть запись с такими же измерениями
// и таким же периодом
);

// Пример №2.

// При помощи менеджера можно также легко
// менять или удалять единичные записи.
// Найдём, изменим, а затем удалим созданную запись.

Выборка = РегистрыСведений.КурсВалют.Выбрать('20140101', '20140101');
Если Выборка.Следующий() Тогда
Запись = Выборка.ПолучитьМенеджерЗаписи();
// изменим
Запись.Прочитать();
Запись.Курс = 25;
// запишем
Запись.Записать(Истина);
// и тут же удалим
Запись.Удалить();
КонецЕсли;

// Пример №3.

// Если нужно изменить сразу много записей -
// удобнее всего использовать набор записей.

// Запишем курсы валют за первые 3 дня 2014 года.

Доллар = Справочники.Валюты.НайтиПоНаименованию("Доллар");

НаборЗаписей = РегистрыСведений.КурсВалют.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Валюта.Установить(Доллар);

Запись01 = НаборЗаписей.Добавить();
Запись01.Период = '20140101';
Запись01.Валюта = Доллар;
Запись01.Курс = 30;

Запись02 = НаборЗаписей.Добавить();
Запись02.Период = '20140102';
Запись02.Валюта = Доллар;
Запись02.Курс = 40;

Запись03 = НаборЗаписей.Добавить();
Запись03.Период = '20140103';
Запись03.Валюта = Доллар;
Запись03.Курс = 60;

// Запишем весь набор разом.

НаборЗаписей.Записать(
Истина // затрём все другие записи по
// доллару (мы установили его в отборе)
);

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

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

vosmerka

alexandr_ll, Автоматическое заполнение работает, спасибо, но помимо этого мне нужно чтобы в списке выбора контактного лица были именно контактные лицы контрагента которого мы выбираем в строке покупатель, как это можно сделать?

nvj84

У контактного лица настроить связь параметров выбора (Покупателя выбираете и получается отбор по владелец).

Теги:

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

Рейтинг@Mail.ru Rambler's Top100

Поиск