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

Назначить действие на кнопку

Автор Dmitrii_VVV, 26 мая 2023, 15:02

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

Dmitrii_VVV

Коллеги, подскажите

Есть реквизит ТЧ - Курс, есть кнопка, необходимо при нажатии на кнопку установить в ТЧ курс валюты

На код ругается, что ни так делаю подскажите...

alexandr_ll

Dmitrii_VVV, Ну написано же - не определена переменная валюта2. Откуда она берется?
Нет функции Получить курс валюты. Вообще - что такое курс валюты? По курсу нужен регистр сведений, а не реквизит справочника. Он же каждый день разный.

Dmitrii_VVV

Цитата: alexandr_ll от 26 мая 2023, 17:12Dmitrii_VVV, Ну написано же - не определена переменная валюта2. Откуда она берется?
Нет функции Получить курс валюты. Вообще - что такое курс валюты? По курсу нужен регистр сведений, а не реквизит справочника. Он же каждый день разный.

Курс валюты это Регистр сведений, с измерением валюта и ресурсом курс



https://wampi.ru/image/RVJjvzl

fruitella

Dmitrii_VVV, Ну вот смотри.
У нас вызывается функция Валюта2НаСервере(). Что там происходит? Тут идет возврат Валюта2.Курс и компилятор тебе сообщает: "Извини, но я тебя не понимаю, что такое Валюта2".
Чтобы обратиться к Регистру сведений, мы должны воспользоваться Глобальным контекстом, типа такого:
РегистрКурсыВалют = РегистрыСведений.КурсыВалют;Если нам нужно, что-то в него записать, по твоей логике видимо надо, т.к. ты хочешь при клике на кнопку заполнять какими то данными. Тогда добавляешь РегистрКурсыВалют = РегистрыСведений.КурсыВалют.СоздатьМенеджерЗаписи();
Теперь пробуешь обратиться к своему полю. Рекомендую научиться пользоваться отладчиком, это незаменимая вещь. Всегда ставь точку остановы и проходись по каждому полю, где у тебя появляется ошибка.

alexandr_ll

Dmitrii_VVV, Ну вот у вас в документе есть реквизит "Курс" и в табличной части есть реквизит "Курс". Они что - разные? Вы в шапке уже находили курс валюты?
Как получить значение периодического регистра сведений
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;

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

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

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

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

Dmitrii_VVV

Цитата: fruitella от 30 мая 2023, 00:30Теперь пробуешь обратиться к своему полю. Рекомендую научиться пользоваться отладчиком, это незаменимая вещь. Всегда ставь точку остановы и проходись по каждому полю, где у тебя появляется ошибка.


Благодарю! Объясняешь максимально доходчиво

Вопрос по отладчику, его ведь мы запускаем только запуская в пользовательском режиме соответствующую процедуру, так?
А если , допустим, нажимая на кнопку, у нас вылезает сообщение об ошибке, то соответственно и отладчик не запустить.
Может другие способы запуска отладчика существуют?

fruitella

Dmitrii_VVV, Я не понял вопроса. Запуск отладчика через конфигуратор, ставишь точку остановы и дебаг стартанет с того места, где установлен брекпойнт - точка остановы.

nvj84

1. Если уж так сильно надо можно "Отладка-Остановка по ошибке..." установить "Останавливаться по ошибке".
2. Еще посмотрите что такое НаСервереБезКонтекста. Такие методы будут знать только то что в них передали в виде параметров (про форму, ее реквизиты и все остальное знать они не обязаны).
3. Вы находитесь на клиенте, идете на сервер, потом что то делаете на клиенте и опять идете на сервер. Зачем вам лишние серверные вызовы?

Dmitrii_VVV

Цитата: fruitella от 30 мая 2023, 17:02Dmitrii_VVV, Я не понял вопроса. Запуск отладчика через конфигуратор, ставишь точку остановы и дебаг стартанет с того места, где установлен брекпойнт - точка остановы.


Я к тому, что мне не запустить отладчик, если в процедуре, по которой он запускается ошибка . Как мог объяснил )

Выдаёт данную ошибку при запуске отладчика, в моём случае, при нажатии на кнопку Валюта 2

https://wampi.ru/image/RV0zUXw

Dmitrii_VVV

Цитата: nvj84 от 31 мая 2023, 01:49Вы находитесь на клиенте, идете на сервер, потом что то делаете на клиенте и опять идете на сервер. Зачем вам лишние серверные вызовы?

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

Теги:

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

Рейтинг@Mail.ru

Поиск