Вопрос № 79367: Здравствуйте! У меня еще один вопрос к предыдущему. А возможно в журнале сделать выборку сразу по двух реквизитам документа. Один как бы постоянный, он не меняется пользователем, например, ВидДокумента, а второй могут выбирать пользователи, например ...Вопрос № 79412: Уважаемые эксперты нужен Ваш совет по 1С в7.7.
Конфигурация самописная.
Нужно устроить проверку при нажатии кнопки "Закрыть".
Если на вопрос "сохранить изменения?" Ответ "Нет", то понятно просто закрыть. А ес...Вопрос № 79421: Здравствуйте Уважаемые эксперты!
Нужен ваш совет. Написал простенький отчет, почти все готово, но не получается вывести в отчет итоговые данные по столбцам. В переменную ИтогоНаНачало получилось, а в переменные ИтогоПриход и ИтогоРасход выводит н...
Вопрос № 79.367
Здравствуйте! У меня еще один вопрос к предыдущему. А возможно в журнале сделать выборку сразу по двух реквизитам документа. Один как бы постоянный, он не меняется пользователем, например, ВидДокумента, а второй могут выбирать пользователи, например Контрагент. Заранее благодарю
P.S. 1с Бухгалтерия 7.7, 25 релиз
Отправлен: 22.03.2007, 15:35
Вопрос задала: MaShI (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Татьяна Ласовская
Здравствуйте, MaShI!
Да, можно - путем некоторых ухищрений. Например, в одной методических конфигураций 1С предлагала такой путь:
1. Нужно создать общий реквизит документов типа "Строка", размер строки равен максимальной длине строкового представления реквизитов, по которым нужно делать отбор. В вашем случае - это длина Наименования справочника "Контрагенты" плюс еще 100 или 150 для вида документа.
2. Прописать в каждом документе заполнение этого общего реквизита.
3. Прописать обработкой значение общего реквизита у уже созданных документов.
4. Использовать общий реквизит документов для отбора, предварительно подготовив нужную строку, состоящую в вашем случае из вида документа и контрагента.
Используя эту технологию можно делать отборы по любому количеству реквизитов.
Ответ отправила: Татьяна Ласовская (статус: 4-ый класс)
Ответ отправлен: 22.03.2007, 18:36
Вопрос № 79.412
Уважаемые эксперты нужен Ваш совет по 1С в7.7.
Конфигурация самописная.
Нужно устроить проверку при нажатии кнопки "Закрыть".
Если на вопрос "сохранить изменения?" Ответ "Нет", то понятно просто закрыть. А если ответ "Да", то нужно проверить - открывался ранее созданный документ или текущий документ только что создали, т.е. документ "новый".
Отправлен: 22.03.2007, 20:09
Вопрос задал: Ramzes (статус: 1-ый класс)
Всего ответов: 6 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Татьяна Ласовская
Здравствуйте, Ramzes!
Используйте предопределенную процедуру ПриЗаписи()
Кратко алгоритм:
В модуле формы документа определяете переменную, например НовыйДокумент. В предопределенной процедуре ВводНового (или ВводНаОсновании, или в обеих - это зависит от способа создания нового документа) переменной НовыйДокумент присваиваете значение 1. Затем в процедуре ПриЗаписи() проверяете с помощью функции ПустоеЗначение(НовыйДокумент), присвоено ли переменной НовыйДокумент какое-либо значение (фактически, выполнялась ли процедура ВводНового или ВводНаОсновании).
Ответ отправила: Татьяна Ласовская (статус: 4-ый класс)
Ответ отправлен: 22.03.2007, 20:30 Оценка за ответ: 5 Комментарий оценки: Спасибо. Именно то что нужно.
Отвечает: Palkin
Здравствуйте, Ramzes!
Можно сделать ещё проще. Проверяется методом Выбран(). Соответственно, если новый - Выбран() = 0, если нет - Выбран() = 1
Ответ отправил: Palkin (статус: 4-ый класс)
Ответ отправлен: 23.03.2007, 06:21 Оценка за ответ: 4 Комментарий оценки: Спасибо.
Отвечает: ATan
Здравствуйте, Ramzes!
Провека на то создан документ возможна также следующим условием
Если ПустоеЗначение(ТекущийДокумент()) = 1 Тогда
//Тогда документ новый
КонецЕсли;
Или еще одним способом
Если СравнитьТА() = -2 Тогда
//Тогда документ новый
КонецЕсли;
Удачи.
Ответ отправил: ATan (статус: 3-ий класс)
Ответ отправлен: 23.03.2007, 09:36 Оценка за ответ: 4 Комментарий оценки: Спасибо. Я решил воспользоваться процедурой ВводНового().
Отвечает: Vlad Skorochod
Здравствуйте, Ramzes!
Проверку на новый документ можно выполнять стандартной функцией
Если Выбран()=0 Тогда
Сообщить("Это новый документ !!!");
КонецЕсли;
Ответ отправил: Vlad Skorochod (статус: 2-ой класс)
Ответ отправлен: 23.03.2007, 10:12 Оценка за ответ: 4 Комментарий оценки: Мне больше понравился вариант с ВводНового(). Но все равно спасибо.
Отвечает: Strawberry
Здравствуйте, Ramzes!
Как вариант
При создании документа в процедуре ВводНового() присваивать некоторой переменной значение 1
В процедуре приЗаписи() проверять это значение. если 1 то новый документ если нет то ранее созданный
--------- Мальчик-извращенец прочел деду Морозу с табуретки всего Пастернака!
Ответ отправил: Strawberry (статус: 5-ый класс)
Ответ отправлен: 23.03.2007, 10:16 Оценка за ответ: 4 Комментарий оценки: Именно так я и сделал по предыдущему совету. Спасибо.
Отвечает: Ovr1970
Здравствуйте, Ramzes!
Проверить документ на новый он или нет можно с помощью метода Выбран()
Управлять поведением документа можно несколькими способами, наиболее продвинутый такой:
Вы на кнопку вешаете процедуру.
В теле процедуры проверяете необходимость задания вопросов и действий в зависимости от состояния документа и прав пользователя.
Допустим принято решение, что данный документ нужно записать и закрыть, а о его проведении нужно спросить пользователя интерактивно.
Тогда в конце процедуры присваиваете:
Если записать и провести автоматом, а спросить о закрытии, то
СтрокаДействийФормы="# Записать Провести Закрыть?"
Ответ отправил: Ovr1970 (статус: Студент)
Ответ отправлен: 23.03.2007, 12:04
Вопрос № 79.421
Здравствуйте Уважаемые эксперты!
Нужен ваш совет. Написал простенький отчет, почти все готово, но не получается вывести в отчет итоговые данные по столбцам. В переменную ИтогоНаНачало получилось, а в переменные ИтогоПриход и ИтогоРасход выводит нуль.
Подскажите может, что-то делаю не правильно?
Заранее благодарен!!!
Приложение:
Отправлен: 22.03.2007, 21:02
Вопрос задал: V lad (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Palkin
Здравствуйте, V lad!
Предполагаю, что общая сумма по 2-му запросу не подсчитывается из-за позиционирования на строке запроса. Задайте переменные и подсчитывайте их во время обхода группировки запроса
Ответ отправил: Palkin (статус: 4-ый класс)
Ответ отправлен: 23.03.2007, 08:25
Отвечает: svsrus
Здравствуйте, V lad!
Видимо Вы не до конца разобрались с запросом. Если есть книга Описание встроенного языка, советую еще раз внимательно перечитать, так как в запросах много подводных камней. Несколько замечаний на будущее:
1) Если есть 2 объекта Запрос и Запрос2, необязательно писать в тексте запроса Товар2 и т.д. Во-первых это может привести к дополнительной путанице и доп.ошибкам, во-вторых это Ваше потраченное время, т.к. текст второго запроса можно было ввести копированием текста первого запроса, а изменить только нужные тебе даты.
2) Строка в запросе
|Товар = Документ.ПрихНакл.Товар, Документ.РасхНакл.Товар, Справочник.Товары.ТекущийЭлемент;
верная, но не рациональная. "Правильней" будет так:
|Товар = Документ.ПрихНакл.Товар, Документ.РасхНакл.Товар;
Почему? Потому что тебе нужно количество товара. Запрос перебирает все документы и подсчитывает кол-во товара для каждого товара, на который были накладные. Все равно по товарам из справочника, для которых не было накладных запрос не вернет никаких результатов. Т.е. 1Ска будет выполнять лишнюю и совершенно ненужную работу. Например если, теоретически, у тебя в справочник занесено миллион товаров, а по накладным отпускается всего 2-3 товара, представляешь какую лишнюю работу будет выполнять запрос, естественно
это скажется на времени выполнения запроса.
3)Судя по документам в запросе, у тебя конфигурация Торговля и Склад, из чего следует, что использование запросов по документам НЕЦЕЛЕСООБРАЗНО. Нужно сделать запрос по регистрам. Я несилен в ТиС и соответственно в регистрах. Если бы я это делал в Бухгалтерии, то тут запрос совсем не нужен. Есть Бухгалтерский Запрос. И весь твой огромный запрос(Запрос) для нахождения остатка (НаНачало=Запрос.КоличПрихСумма-Запрос.КоличРасхСумма;) свелся бы всего к одной строчке - нахождения сальдо на конец периода. А весь код
твоего отчета превратился бы в 2-5 строчек. То же самое я думаю можно сделать и в ТиС. Посмотри в литературе работу с регистрами, регистрами остатков.
Теперь по сути вопроса.
Пока Запрос.Группировка(1) = 1 Цикл
НаНачало=Запрос.КоличПрихСумма-Запрос.КоличРасхСумма;
....
КонецЦикла
Цикл открывает выборки по Запросу. Пусть первый Товар = Арбуз. Тогда первая выборка будет не что иное как Таблица Значений с 3 колонками: Товар=Арбуз, КоличПрих, КоличРасх. А Функция КоличПрихСумма = Сумма(КоличПрих); возвращает тебе сумму по колонке "КоличПрих". Код работает. Все правильно.
Смотрим дальше...
Если Запрос2.Получить(Запрос.Товар)=1 Тогда
Читаем справку по методу Получить.
Назначение:
Прямое позиционирование на запись в выборке по конкретным значениям группировок.
ВО!!! "Позиционирование на запись в выборке"!!! А где у нас выборка? А нет у нас никакой выборки, т.к. выборка открывается строкой Запрос.Группировка()!!! Поэтому функция ничего и не считает... А 0 возвращает потому, что функции в запросе имеют Тип Число. А пустое значение типа число = 0.
Вообщем тебе нужно открыть выборку. В твоем случае надо выполнять запрос2 в запросе с Условие (Товар=ЗапросТовар);. Но это, как я уже писал выше не очень рационально. Дерзай.
Удачи!
Ответ отправил: svsrus (статус: 4-ый класс)
Ответ отправлен: 24.03.2007, 08:19 Оценка за ответ: 5 Комментарий оценки: Огромное спасибо, ЗА РАЗЪЯСНЕНИЯ, за грамотный и развернутый ответ! Действительно открыв выборку я получил, то что мне надо. Еще раз спасибо!