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

Работа в модуле команды

Автор Алексей_1985_06, 22 июл 2022, 21:41

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

Алексей_1985_06

Здравствуйте форумчане! Знатоков прошу помощи, есть справочник "СписокКниг", и кнопка  "Download File" для получения электронного файла этой книги, находясь на форме списка при нажатии на данную кнопку, если файл отсутствует - то выходит окно диалога с предложением записать файл книги в РС, при нажатии "ДА", необходимо открыть форму записи РС и установить значение реквизита "НаименованиеДокумента" (измерения РС: НаименованиеДокумента) - из реквизита "НаименованиеДокумента" справочника "СписокКниг", подскажите как в модуле команды получить ссылку на элемент справочника, чтобы передать ее в параметры открытия формы записи РС

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)


Если ПолучитьАдресДокумента(ПараметрКоманды) = Неопределено  // ПолучитьАдресДокумента - процедура модуля
Тогда

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

ПоказатьВопрос(Оповещение, "Электронный документ отсутствует в базе данных библиотеки",   
РежимДиалогаВопрос.ДаНетОтмена, 0 , , "Загрузить электронный файл документа?");
Возврат
КонецЕсли;


ПараметрыДиалога = Новый ПараметрыДиалогаПолученияФайлов();
ПараметрыДиалога.Заголовок = НСтр("ru = 'Выберите путь для сохранения файла'; en = 'Select the path to save the file'");
НачатьПолучениеФайлаССервера(ПолучитьАдресДокумента(ПараметрКоманды),ПолучитьИмяИФорматФайла(ПараметрКоманды),ПараметрыДиалога);

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


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

Если РезультатВопроса = КодВозвратаДиалога.Да Тогда
ОткрытьФорму("РегистрСведений.ЭлектронныеДокументы.Форма.ФормаЗаписи"); // Необходимо открыть форму и передать в нее значение реквизита "НаименованиеДокумента" из справочника "СписокКниг"
КонецЕсли;

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

alexandr_ll

Алексей_1985_06, А зачем вообще открывать форму записи регистра сведений?

Алексей_1985_06

alexandr_ll, Потому-что в РС хранятся электронные файлы документов, те. есть справочник который хранит названия этих документов, и при нажатии на кнопку  "Загрузить" из формы списка этих документов, происходит загрузка файла (который храниться в РС), в случае отсутствия файла в РС - выходит диалог с вопросом "Загрузить файл" и при нажатии "ДА" - необходимо открыть форму записи РС с передачей значения "Наименование документа" и в последствии загрузить файл.

alexandr_ll

Цитата: Алексей_1985_06 от 23 июл 2022, 14:11alexandr_ll, Потому-что в РС хранятся электронные файлы документов, те. есть справочник который хранит названия этих документов, и при нажатии на кнопку  "Загрузить" из формы списка этих документов, происходит загрузка файла (который храниться в РС), в случае отсутствия файла в РС - выходит диалог с вопросом "Загрузить файл" и при нажатии "ДА" - необходимо открыть форму записи РС с передачей значения "Наименование документа" и в последствии загрузить файл.
Так и не понял, почему нельзя загрузить информацию в регистр, не открывая его форму. Почему файл загружается после открытия формы, а не до этого?

Алексей_1985_06

alexandr_ll, Подскажите в таком случае пожалуйста  :dfbsdfbsdf: , как загрузить файл из модуля формы в РС?

alexandr_ll

Алексей_1985_06, Ну вы же не файл будете загружать в РС, а ссылку.
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;

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

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

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

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

Теги:

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

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

Поиск