Консультация № 64433
27.11.2006, 15:10
0.00 руб.
0 7 5
Здравствуйте эксперты! Обработка (см.приложение) работает, но неправильно. Почему там, где надо поставить "оплачено", ставит "неоплачено" и наоборот? И как указать сразу, что Док.Оплата1="Оплачено" без использования НайтиПоНаименованию. Растолкуйте пожалуйста. Благодарю!

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

Обсуждение

Неизвестный
27.11.2006, 18:03
общий
это ответ
Здравствуйте, Darina!

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


Приложение:
Процедура Выполнить() Док = СоздатьОбъект("Документ.РасходнаяНалО"); Спр=СоздатьОбъект("Справочник.Оплата"); Если Спр.НайтиПоНаименованию("Оплачено",0)=1 Тогда СпрОпл=Спр.ТекущийЭлемент(); Иначе Сообщить("Не найден элемент Оплачено!"); Возврат; КонецЕсли; Если Спр.НайтиПоНаименованию("Неоплачено",0)=1 Тогда СпрНеОпл=Спр.ТекущийЭлемент(); Иначе Сообщить("Не найден элемент Неоплачено!"); Возврат; КонецЕсли; Док.ВыбратьДокументы( ДатаНач , ДатаКон ); НачатьТранзакцию(); Пока Док.ПолучитьДокумент() = 1 Цикл Если Док.Оплата=Док.Сумма Тогда Док.Оплата1= СпрОпл; Иначе Док.Оплата1= СпрНеОпл; КонецЕсли; Док.Записать(); Сообщить("В документе " +Док+ " добавили" ); КонецЦикла; ЗафиксироватьТранзакцию();КонецПроцедуры
Неизвестный
27.11.2006, 18:21
общий
это ответ
Здравствуйте, Darina!
правильнее было бы сделать Оплачено\Не оплачено перечислением или числом (галочка оплачено(1)\не оплачено(0))
если хотите писать Док.Оплата1="Оплачено" то нужно установить тип реквизита Оплата1-строка.
В Вашем варианте я бы сделал так как в приложении.
По поводу логики работы-конфигурация видимо нестандартная, типы и назначение реквизитов мне неизвестны, поэтому рекомендую в отладчике на строке
Если Док.Оплата=Док.Сумма Тогда
поставить точку и посмотреть значения переменных Док.Оплата и Док.Сумма, а так же их тип и длину, все должно прояснится. Может быть нужно сделать так
Если Число(Док.Оплата)=(Док.Сумма) Тогда

Приложение:
Процедура Выполнить()Док = СоздатьОбъект("Документ.РасходнаяНалО"); Спр=СоздатьОбъект("Справочник.Оплата");Спр.НайтиПоНаименованию("Оплачено",0); Оплачено=Спр.ТекущийЭлемент();Спр.НайтиПоНаименованию("НеОплачено",0);НеОплачено=Спр.ТекущийЭлемент(); Док.ВыбратьДокументы( ДатаНач , ДатаКон );Пока Док.ПолучитьДокумент() = 1 Цикл Если Док.Оплата=Док.Сумма ТогдаДок.Оплата1= Оплачено; Иначе Док.Оплата1= Неоплачено;КонецЕсли;Док.Записать();Сообщить("В документе " +Док+ " добавили" );КонецЦикла;КонецПроцедуры
Неизвестный
28.11.2006, 07:33
общий
это ответ
Здравствуйте, Darina!
Идея со справочниками не совсем правильная на мой взгляд.
Если у вас всего два или несколько элкментов, воспользуйтесь перечислениями
Неизвестный
28.11.2006, 09:28
общий
это ответ
Здравствуйте, Darina!

Ну если оплата - реквизит шапки, а сумма - многострочной части
то надо сравнивать Док.Оплата=Док.Итог("Сумма")
При этом у реквизита сумма должна стоять галочка - "итог по колонке"
см. приложение
Удачи!

Приложение:
Процедура Выполнить()Док = СоздатьОбъект("Документ.РасходнаяНалО"); Спр=СоздатьОбъект("Справочник.Оплата");Док.ВыбратьДокументы( ДатаНач , ДатаКон );Пока Док.ПолучитьДокумент() = 1 Цикл Если Док.Оплата=Док.Итог("Сумма") ТогдаСпр.НайтиПоНаименованию("Оплачено",0); Док.Оплата1= Спр.ТекущийЭлемент(); Иначе Спр.НайтиПоНаименованию("Неоплачено",0); Док.Оплата1= Спр.ТекущийЭлемент();КонецЕсли;Док.Записать();Сообщить("В документе " +Док+ " добавили" );КонецЦикла;КонецПроцедуры
Неизвестный
28.11.2006, 10:54
общий
Игорь К.!!!!!Нужно бы знать, что Док.Итог("Сумма") работает даже если не стоит итог по колонке (но медленнее). Зато размер служебных данных будет меньше, что положительно скажется на быстродействии.Если не стоит итог по колонке, то Вы итог не сможете отображать в колонках журнала, только и всего.
Неизвестный
28.11.2006, 11:06
общий
это ответ
Здравствуйте, Darina!
Я смотрю, на первый вопрос ответили, отвечу на второй. Можно.
Если СокрЛП(Док.Оплата1.Наименование)="Оплачено" Тогда //оплачено

А теперь об теоретической ошибке. Вы вычисляете дублирующиеся служебные данные Оплата1, которые только перегружают базу и не нужны в базе. Лучше их вычислять каждый раз. Например, если нужно в форме документа написать Оплачено, то положите на форму текстовое поле без имени и заголовка, в свойстве дополнительно которого написано Оплачено1, а в модуле формы напишите
Перем Оплачено1;
Процедура ПриОткрытии()
Если Оплата=Итог("Сумма") Тогда
Оплачено1="Оплачено";
ИначеЕсли Оплата>Итог("Сумма") Тогда
Оплачено1="Переплачено";
ИначеЕсли Оплата>0 Тогда
Оплачено1="Недоплачено";
Иначе
Оплачено1="Не оплачено";
КонецЕсли;

Раскрасьте данное поле красным жирным цветом и размером шрифта по настроению.
В противном случае при изменении документа поля Оплата поле Оплата1 не пересчитывается, и более того, при нулевом значении поля Оплата можно интерактивно установить значение Оплачено.
Неизвестный
28.11.2006, 11:20
общий
Спасибо всем! Какая же классная эта рассылка!
Форма ответа