|   |   | 
| 
 | Как прочитать таблицу обработки? | ☑ | ||
|---|---|---|---|---|
| 0
    
        falselight 19.03.19✎ 15:12 | 
        Есть обработка. У неё есть табличная часть, она расположена на форме.
 Как мне к ней получать доступ что бы её перебрать? | |||
| 1
    
        Ёпрст гуру 19.03.19✎ 15:13 | 
        (0) Спросить разрешения у взрослых     | |||
| 2
    
        falselight 19.03.19✎ 15:15 | 
        (1) Подскажите по коду пожалуйста.     | |||
| 3
    
        OldCondom 19.03.19✎ 15:15 | 
        (1) если это только элементы формы, не все так тривиально     | |||
| 4
    
        elCust 19.03.19✎ 15:16 | 
        (0) Кнопочку на форму добавь! Назови ее "Перебрать ТЧ".     | |||
| 5
    
        Mankubus 19.03.19✎ 15:16 | 
        (2) объект.моятабчасть     | |||
| 6
    
        falselight 19.03.19✎ 15:17 | 
        Управляемое приложение. Интерфейс такси.
 У обработки табличная часть, я ё добавил на форму. Как мне её прочитать в коде. Не получается. | |||
| 7
    
        Fish гуру 19.03.19✎ 15:18 | 
        (6) Показывай пример кода. Как делал, что не получается.     | |||
| 8
    
        elCust 19.03.19✎ 15:18 | 
        А что не получается? Покажи что уже пробовал.     | |||
| 9
    
        Chameleon1980 19.03.19✎ 15:26 | 
        Для Каждого СтрокаТЧ Из Объект.ТвояТЧ Цикл
 КонецЦикла | |||
| 10
    
        falselight 19.03.19✎ 15:49 | 
        В обработке, в функции на клиенте заполняю табличную часть.
 Но при выходе из функции идет такая ошибка. Почему? {ВнешняяОбработка.ЗагрузкаСXLSТабличнойЧастиЗаказНаПеремещение_0_2.Форма.Форма.Форма(30)}: Ошибка при установке значения атрибута контекста (ЗаказНаПеремещение) РезультатЗагрузки = ВыполнитьЗагрузкуНаСервере(АдресХранения, по причине: Нельзя изменять поле, содержащее объект данных формы | |||
| 11
    
        falselight 19.03.19✎ 15:50 | 
        &НаСервере
 Функция ВыполнитьЗагрузкуНаСервере(АдресХранения, ПерваяСтрока, КолонкаКодСтроки, КолонкаНаименование, КолонкаХарактеристика, КолонкаСерия, КолонкаУпаковка, КолонкаКоличество, КолонкаКоличествоУпаковок, КолонкаОтменено, КолонкаНачалоОтгрузки, КолонкаОкончаниеПоступления, КолонкаВариантОбеспечения, КолонкаНазначение, КолонкаСтатусУказанияСерий, ДокЗаказНаПеремещение, ТчЗаказНаПеремещение) Путь = КаталогВременныхФайлов() + "temp.xls"; Файл = ПолучитьИзВременногоХранилища(АдресХранения); Файл.Записать(Путь); Попытка ОбъектExcel = Новый COMОбъект("Excel.Application"); Исключение Возврат "Ошибка открытия MS Excel"; КонецПопытки; Попытка ОбъектExcel.WorkBooks.Open(Путь); Исключение ОбъектExcel.DisplayAlerts = 0; ОбъектExcel.Quit(); ОбъектExcel.DisplayAlerts = 1; Возврат "Ошибка открытия файла для чтения: " + Путь; КонецПопытки; Попытка ОбъектExcel.Sheets(1).Select(); Исключение ОбъектExcel.ActiveWorkbook.Close(); ОбъектExcel = 0; Возврат "Ошибка при чтении файла: " + Путь; КонецПопытки; Version = ОбъектExcel.Version; Версия = Лев(Version, Найти(Version,".") - 1 ); Если Версия = "8" тогда ФайлСтрок = ОбъектExcel.Cells.CurrentRegion.Rows.Count; ФайлКолонок = Макс(ОбъектExcel.Cells.CurrentRegion.Columns.Count, 13); Иначе ФайлСтрок = ОбъектExcel.Cells(1,1).SpecialCells(11).Row; ФайлКолонок = ОбъектExcel.Cells(1,1).SpecialCells(11).Column; Конецесли; Для НС = ПерваяСтрока по ФайлСтрок Цикл НоваяСтрока = ТчЗаказНаПеремещение.Добавить(); НоваяСтрока.КодСтроки = СокрЛП(ОбъектExcel.Cells(НС, КолонкаКодСтроки).Text); // 1. НоваяСтрока.Номенклатура = СокрЛП(ОбъектExcel.Cells(НС, КолонкаНаименование).Text); // 2. НоваяСтрока.Характеристика = СокрЛП(ОбъектExcel.Cells(НС, КолонкаХарактеристика).Text); // 3. НоваяСтрока.Серия = СокрЛП(ОбъектExcel.Cells(НС, КолонкаСерия).Text); // 4. НоваяСтрока.Упаковка = СокрЛП(ОбъектExcel.Cells(НС, КолонкаУпаковка).Text); // 5. НоваяСтрока.Количество = СокрЛП(ОбъектExcel.Cells(НС, КолонкаКоличество).Text); // 6. НоваяСтрока.КоличествоУпаковок = СокрЛП(ОбъектExcel.Cells(НС, КолонкаКоличествоУпаковок).Text); // 7. НоваяСтрока.Отменено = СокрЛП(ОбъектExcel.Cells(НС, КолонкаОтменено).Text); // 8. НоваяСтрока.НачалоОтгрузки = СокрЛП(ОбъектExcel.Cells(НС, КолонкаНачалоОтгрузки).Text); // 9. НоваяСтрока.ОкончаниеПоступления = СокрЛП(ОбъектExcel.Cells(НС, КолонкаОкончаниеПоступления).Text); // 10. НоваяСтрока.ВариантОбеспечения = СокрЛП(ОбъектExcel.Cells(НС, КолонкаВариантОбеспечения).Text); // 11. НоваяСтрока.Назначение = СокрЛП(ОбъектExcel.Cells(НС, КолонкаНазначение).Text); // 12. НоваяСтрока.СтатусУказанияСерий = СокрЛП(ОбъектExcel.Cells(НС, КолонкаСтатусУказанияСерий).Text); // 13. КонецЦикла; Возврат ""; | |||
| 12
    
        falselight 19.03.19✎ 15:52 | 
        &НаКлиенте
 Процедура НачатьВыполнениеЗагрузки(Результат, Параметры) Экспорт Если НЕ Результат = КодВозвратаДиалога.Да Тогда Возврат; КонецЕсли; //РеквизитИзФормыВЗначение("Объект.ЗаказНаПеремещение"); РезультатЗагрузки = ВыполнитьЗагрузкуНаСервере(АдресХранения, ПерваяСтрока, КолонкаКодСтроки, КолонкаНаименование, КолонкаХарактеристика, КолонкаСерия, КолонкаУпаковка, КолонкаКоличество, КолонкаКоличествоУпаковок, КолонкаОтменено, КолонкаНачалоОтгрузки, КолонкаОкончаниеПоступления, КолонкаВариантОбеспечения, КолонкаНазначение, КолонкаСтатусУказанияСерий, ДокЗаказНаПеремещение, Объект.ЗаказНаПеремещение); Если ТипЗнч(РезультатЗагрузки) = Тип("Строка") Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = РезультатЗагрузки; Сообщение.Поле = "ИмяФайла"; Сообщение.Сообщить(); КонецЕсли; КонецПроцедуры | |||
| 13
    
        falselight 19.03.19✎ 15:56 | 
        Чтобы не было ошибки (10) что нужно подправить?     | |||
| 14
    
        Fish гуру 19.03.19✎ 15:58 | 
        (13) Не изменять поле, содержащее объект данных формы.     | |||
| 15
    
        falselight 19.03.19✎ 16:01 | 
        (14) А где эта ошибка в коде? (11) (12)     | |||
| 16
    
        falselight 19.03.19✎ 16:02 | 
        (14) Что не так я делаю? Как что бы все прошло без ошибок?     | |||
| 17
    
        Fish гуру 19.03.19✎ 16:04 | 
        (15) В строке 30 модуля формы, судя по тексту ошибки.     | |||
| 18
    
        falselight 19.03.19✎ 16:07 | 
        (17) Строка 30, курсор на первой строке
 РезультатЗагрузки = ВыполнитьЗагрузкуНаСервере(АдресХранения, ПерваяСтрока, | |||
| 19
    
        falselight 19.03.19✎ 16:08 | 
        (17) При открытии первая строка устанавливается в 3
 &НаКлиенте Процедура ПриОткрытии(Отказ) ПерваяСтрока = 3; | |||
| 20
    
        falselight 19.03.19✎ 16:09 | 
        Что может быть не так?     | |||
| 21
    
        falselight 19.03.19✎ 16:12 | 
        Что нужно исправить подскажите пожалуйста?
 ПерваяСтрока - это реквизит формы. | |||
| 22
    
        falselight 19.03.19✎ 16:16 | 
        Смотрю по коду не пойму вроде все нормально ((( Подскажите пожалуйста.
 Весь код: // &НаКлиенте Процедура ИмяФайлаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; Описание = Новый ОписаниеОповещения("ЗакончитьВыборФайла", ЭтотОбъект); НачатьПомещениеФайла(Описание,,,Истина, УникальныйИдентификатор); КонецПроцедуры // &НаКлиенте Процедура ЗакончитьВыборФайла(Результат, Адрес, Имя, ДопПараметры) Экспорт Если Результат Тогда ИмяФайла = Имя; АдресХранения = Адрес; КонецЕсли; КонецПроцедуры // &НаКлиенте Процедура ВыполнитьЗагрузку(Команда) Оповещение = Новый ОписаниеОповещения("НачатьВыполнениеЗагрузки", ЭтаФорма); ПоказатьВопрос(Оповещение, "Выполнить загрузку данных из файла """ + ИмяФайла + """ ?", РежимДиалогаВопрос.ДаНет, , , "Начало загрузки"); КонецПроцедуры // &НаКлиенте Процедура НачатьВыполнениеЗагрузки(Результат, Параметры) Экспорт Если НЕ Результат = КодВозвратаДиалога.Да Тогда Возврат; КонецЕсли; РезультатЗагрузки = ВыполнитьЗагрузкуНаСервере(АдресХранения, ПерваяСтрока, КолонкаКодСтроки, КолонкаНаименование, КолонкаХарактеристика, КолонкаСерия, КолонкаУпаковка, КолонкаКоличество, КолонкаКоличествоУпаковок, КолонкаОтменено, КолонкаНачалоОтгрузки, КолонкаОкончаниеПоступления, КолонкаВариантОбеспечения, КолонкаНазначение, КолонкаСтатусУказанияСерий, ДокЗаказНаПеремещение, Объект.ЗаказНаПеремещение); Если ТипЗнч(РезультатЗагрузки) = Тип("Строка") Тогда Сообщение = Новый СообщениеПользователю; Сообщение.Текст = РезультатЗагрузки; Сообщение.Поле = "ИмяФайла"; Сообщение.Сообщить(); КонецЕсли; КонецПроцедуры // &НаСервере Функция ВыполнитьЗагрузкуНаСервере(АдресХранения, ПерваяСтрока, КолонкаКодСтроки, КолонкаНаименование, КолонкаХарактеристика, КолонкаСерия, КолонкаУпаковка, КолонкаКоличество, КолонкаКоличествоУпаковок, КолонкаОтменено, КолонкаНачалоОтгрузки, КолонкаОкончаниеПоступления, КолонкаВариантОбеспечения, КолонкаНазначение, КолонкаСтатусУказанияСерий, ДокЗаказНаПеремещение, ТчЗаказНаПеремещение) Путь = КаталогВременныхФайлов() + "temp.xls"; Файл = ПолучитьИзВременногоХранилища(АдресХранения); Файл.Записать(Путь); Попытка ОбъектExcel = Новый COMОбъект("Excel.Application"); Исключение Возврат "Ошибка открытия MS Excel"; КонецПопытки; Попытка ОбъектExcel.WorkBooks.Open(Путь); Исключение ОбъектExcel.DisplayAlerts = 0; ОбъектExcel.Quit(); ОбъектExcel.DisplayAlerts = 1; Возврат "Ошибка открытия файла для чтения: " + Путь; КонецПопытки; Попытка ОбъектExcel.Sheets(1).Select(); Исключение ОбъектExcel.ActiveWorkbook.Close(); ОбъектExcel = 0; Возврат "Ошибка при чтении файла: " + Путь; КонецПопытки; Version = ОбъектExcel.Version; Версия = Лев(Version, Найти(Version,".") - 1 ); Если Версия = "8" тогда ФайлСтрок = ОбъектExcel.Cells.CurrentRegion.Rows.Count; ФайлКолонок = Макс(ОбъектExcel.Cells.CurrentRegion.Columns.Count, 13); Иначе ФайлСтрок = ОбъектExcel.Cells(1,1).SpecialCells(11).Row; ФайлКолонок = ОбъектExcel.Cells(1,1).SpecialCells(11).Column; Конецесли; Для НС = ПерваяСтрока по ФайлСтрок Цикл НоваяСтрока = ТчЗаказНаПеремещение.Добавить(); НоваяСтрока.КодСтроки = СокрЛП(ОбъектExcel.Cells(НС, КолонкаКодСтроки).Text); // 1. НоваяСтрока.Номенклатура = СокрЛП(ОбъектExcel.Cells(НС, КолонкаНаименование).Text); // 2. НоваяСтрока.Характеристика = СокрЛП(ОбъектExcel.Cells(НС, КолонкаХарактеристика).Text); // 3. НоваяСтрока.Серия = СокрЛП(ОбъектExcel.Cells(НС, КолонкаСерия).Text); // 4. НоваяСтрока.Упаковка = СокрЛП(ОбъектExcel.Cells(НС, КолонкаУпаковка).Text); // 5. НоваяСтрока.Количество = СокрЛП(ОбъектExcel.Cells(НС, КолонкаКоличество).Text); // 6. НоваяСтрока.КоличествоУпаковок = СокрЛП(ОбъектExcel.Cells(НС, КолонкаКоличествоУпаковок).Text); // 7. НоваяСтрока.Отменено = СокрЛП(ОбъектExcel.Cells(НС, КолонкаОтменено).Text); // 8. НоваяСтрока.НачалоОтгрузки = СокрЛП(ОбъектExcel.Cells(НС, КолонкаНачалоОтгрузки).Text); // 9. НоваяСтрока.ОкончаниеПоступления = СокрЛП(ОбъектExcel.Cells(НС, КолонкаОкончаниеПоступления).Text); // 10. НоваяСтрока.ВариантОбеспечения = СокрЛП(ОбъектExcel.Cells(НС, КолонкаВариантОбеспечения).Text); // 11. НоваяСтрока.Назначение = СокрЛП(ОбъектExcel.Cells(НС, КолонкаНазначение).Text); // 12. НоваяСтрока.СтатусУказанияСерий = СокрЛП(ОбъектExcel.Cells(НС, КолонкаСтатусУказанияСерий).Text); // 13. КонецЦикла; Возврат ""; // Для каждого СтрТз Из ТчЗаказНаПеремещение Цикл //НомерCтроки // 4. //НаименованиеНоменклатуры *** СПРАВОЧНИК *** НаименованиеНоменклатуры = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(ОбъектExcel.Cells(НС, КолонкаНаименование).Text), 1); Если НаименованиеНоменклатуры = Справочники.Номенклатура.ПустаяСсылка() Тогда Сообщить("Номенклатура " + СокрЛП(ОбъектExcel.Cells(НС, КолонкаНаименование).Text) + " не найдена в справочнике номенклатура!"); // НоваяНоменклатура = Справочники.Номенклатура.СоздатьЭлемент(); НоваяНоменклатура.Наименование = СокрЛП(ОбъектExcel.Cells(НС, КолонкаНаименование).Text); НоваяНоменклатура.Записать(); ДокНоваяМСтрока = ДокЗаказНаПеремещение.Товары.Добавить(); ДокНоваяМСтрока.Номенклатура = НоваяНоменклатура.Ссылка; // //Продолжить; Иначе //ДокЗаказНаПеремещение = Документы.ЗаказНаПеремещение.СоздатьДокумент(); ДокНоваяМСтрока = ДокЗаказНаПеремещение.Товары.Добавить(); ДокНоваяМСтрока.Номенклатура = НаименованиеНоменклатуры; КонецЕсли; // 3. //КодСтроки КодСтроки = СокрЛП(ОбъектExcel.Cells(НС, КолонкаКодСтроки).Text); ДокНоваяМСтрока.КодСтроки = ЧИСЛО(КодСтроки); // 5. //Характеристика *** СПРАВОЧНИК *** Характеристика = СокрЛП(ОбъектExcel.Cells(НС, КолонкаХарактеристика).Text); НайденнаяХарактеристика = Справочники.ХарактеристикиНоменклатуры.НайтиПоНаименованию(Характеристика, 1); Если Не НайденнаяХарактеристика = Справочники.ХарактеристикиНоменклатуры.ПустаяСсылка() Тогда ДокНоваяМСтрока.Характеристика = НайденнаяХарактеристика; Иначе Сообщить("Характеристика " + Характеристика + " не найдена в справочнике характеристики номенклатуры!"); КонецЕсли; // 6. //Серия *** СПРАВОЧНИК *** Серия = СокрЛП(ОбъектExcel.Cells(НС, КолонкаСерия).Text); НайденнаяСерия = Справочники.СерииНоменклатуры.НайтиПоНаименованию(Серия, 1); Если Не НайденнаяСерия = Справочники.СерииНоменклатуры.ПустаяСсылка() Тогда ДокНоваяМСтрока.Серия = НайденнаяСерия; Иначе Сообщить("Серия " + Серия + " не найдена в справочнике серии номенклатуры!"); КонецЕсли; // 7. //Упаковка *** СПРАВОЧНИК *** Упаковка = СокрЛП(ОбъектExcel.Cells(НС, КолонкаУпаковка).Text); НайденнаяУпаковка = Справочники.УпаковкиЕдиницыИзмерения.НайтиПоНаименованию(Упаковка, 1); Если Не НайденнаяУпаковка = Справочники.УпаковкиЕдиницыИзмерения.ПустаяСсылка() Тогда ДокНоваяМСтрока.Упаковка = НайденнаяУпаковка; Иначе Сообщить("Упаковка " + Упаковка + " не найдена в справочнике упаковки !"); КонецЕсли; // 8. //Количество Количество = СокрЛП(ОбъектExcel.Cells(НС, КолонкаКоличество).Text); ДокНоваяМСтрока.Количество = ЧИСЛО(Количество); // 9. //КоличествоУпаковок КоличествоУпаковок = СокрЛП(ОбъектExcel.Cells(НС, КолонкаКоличествоУпаковок).Text); ДокНоваяМСтрока.КоличествоУпаковок = ЧИСЛО(КоличествоУпаковок); // 10. //Отменено Отменено = СокрЛП(ОбъектExcel.Cells(НС, КолонкаОтменено).Text); Если Отменено = "Истина" Тогда ДокНоваяМСтрока.Отменено = Истина; ИначеЕсли Отменено = "Ложь" Тогда ДокНоваяМСтрока.Отменено = Ложь; КонецЕсли; // 11. //НачалоОтгрузки НачалоОтгрузки = СокрЛП(ОбъектExcel.Cells(НС, КолонкаНачалоОтгрузки).Text); ДокНоваяМСтрока.НачалоОтгрузки = ДАТА(НачалоОтгрузки); // 12. //ОкончаниеПоступления ОкончаниеПоступления = СокрЛП(ОбъектExcel.Cells(НС, КолонкаОкончаниеПоступления).Text); ДокНоваяМСтрока.ОкончаниеПоступления = ДАТА(ОкончаниеПоступления); // 13. //ВариантОбеспечения ВариантОбеспечения = СокрЛП(ОбъектExcel.Cells(НС, КолонкаВариантОбеспечения).Text); Если ВариантОбеспечения = "ОтгрузитьОбособленно" Тогда ДокНоваяМСтрока.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.ОтгрузитьОбособленно; ИначеЕсли ВариантОбеспечения = "Отгрузить" Тогда ДокНоваяМСтрока.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.Отгрузить; ИначеЕсли ВариантОбеспечения = "СоСклада" Тогда ДокНоваяМСтрока.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.СоСклада; ИначеЕсли ВариантОбеспечения = "ИзЗаказов" Тогда ДокНоваяМСтрока.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.ИзЗаказов; ИначеЕсли ВариантОбеспечения = "Обособленно" Тогда ДокНоваяМСтрока.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.Обособленно; ИначеЕсли ВариантОбеспечения = "Требуется" Тогда ДокНоваяМСтрока.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.Требуется; ИначеЕсли ВариантОбеспечения = "НеТребуется" Тогда ДокНоваяМСтрока.ВариантОбеспечения = Перечисления.ВариантыОбеспечения.НеТребуется; КонецЕсли; // 14. //Назначение *** СПРАВОЧНИК *** Назначение = СокрЛП(ОбъектExcel.Cells(НС, КолонкаНазначение).Text); НайденноеНазначение = Справочники.Назначения.НайтиПоНаименованию(Назначение, 1); Если Не НайденноеНазначение = Справочники.Назначения.ПустаяСсылка() Тогда ДокНоваяМСтрока.Назначение = НайденноеНазначение; Иначе Сообщить("Назначение " + Назначение + " не найдено в справочнике назначения!"); КонецЕсли; // 15. //СтатусУказанияСерий СтатусУказанияСерий = СокрЛП(ОбъектExcel.Cells(НС, КолонкаСтатусУказанияСерий).Text); ДокНоваяМСтрока.СтатусУказанияСерий = ЧИСЛО(СтатусУказанияСерий); // ДокЗаказНаПеремещение.Записать(); КонецЦикла; ОбъектExcel.DisplayAlerts = 0; ОбъектExcel.Quit(); ОбъектExcel.DisplayAlerts = 1; КонецФункции // &НаКлиенте Процедура ПриОткрытии(Отказ) ПерваяСтрока = 3; КолонкаКодСтроки = 3; КолонкаНаименование = 4; КолонкаХарактеристика = 5; КолонкаСерия = 6; КолонкаУпаковка = 7; КолонкаКоличество = 8; КолонкаКоличествоУпаковок = 9; КолонкаОтменено = 10; КолонкаНачалоОтгрузки = 11; КолонкаОкончаниеПоступления = 12; КолонкаВариантОбеспечения = 13; КолонкаНазначение = 14; КолонкаСтатусУказанияСерий = 15; КонецПроцедуры // | |||
| 23
    
        Ёпрст гуру 19.03.19✎ 16:24 | 
        (0) выкинуть последний параметр в функции, в самой функции просто написать
 ТчЗаказНаПеремещение = Объект.ТчЗаказНаПеремещение; кушать печенки | |||
| 24
    
        Ёпрст гуру 19.03.19✎ 16:25 | 
        предпоследний параметр тоже выкинуть     | |||
| 25
    
        Ёпрст гуру 19.03.19✎ 16:25 | 
        и бе с записью     | |||
| 26
    
        Ёпрст гуру 19.03.19✎ 16:25 | 
        бред (не Пит)     | |||
| 27
    
        sqr4 19.03.19✎ 16:27 | 
        (23) у меня тоже раньше на работе были бесплатные печеньки, а теперь нет...     | |||
| 28
    
        falselight 19.03.19✎ 16:30 | 
        Понял! Счас займусь!!!!     | |||
| 29
    
        falselight 19.03.19✎ 16:31 | 
        (25) А это где? С записью?     | |||
| 30
    
        Ёпрст гуру 19.03.19✎ 16:40 | 
        (29) ДокЗаказНаПеремещение.. врят ли ты на сервер объект передаешь. Максимум, ссылку, а объект еще и получиь надо,для записи     | |||
| 31
    
        falselight 19.03.19✎ 16:44 | 
        СПАСИБО!!!!
 (30) Пока мне нужно было заполнить табличную часть на форме. Заполнил. Далее буду дальше обрабатывать. Там будет заполнение табличной части документа. | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |